您可以支持我进行以下 XSLT 转换吗:
初始 xml 文件:
<root>
<Invoice>
<ID>
<_>INV12345</_>
</ID>
<InvoiceTypeCode>
<_>01</_>
<listVersionID>1.0</listVersionID>
</InvoiceTypeCode>
<InvoicePeriod>
<StartDate>
<_>2017-11-26</_>
</StartDate>
<EndDate>
<_>2017-11-30</_>
</EndDate>
</InvoicePeriod>
<AccountingSupplierParty>
<AdditionalAccountID>
<_>id-1234</_>
<schemeAgencyName>name1</schemeAgencyName>
</AdditionalAccountID>
</AccountingSupplierParty>
</Invoice>
</root>
最终 xml 文件:
<Invoice>
<ID>NV12345</ID>
<InvoiceTypeCode listVersionID="1.0">01</InvoiceTypeCode>
<InvoicePeriod>
<StartDate>2017-11-26</StartDate>
<EndDate>2017-11-30</EndDate>
</InvoicePeriod>
<AccountingSupplierParty schemeAgencyName="name1">
<AdditionalAccountID>id-1234</AdditionalAccountID>
</AccountingSupplierParty>
</Invoice>
有必要做:
这样的任务是在 Jackson 将 UBL(通用商业语言)从 JSON 转换为 XML 时发生的。
我刚刚找到了如何删除根标签:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- identity template -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- remove root tag -->
<xsl:template match="/*">
<xsl:apply-templates select="node()" />
</xsl:template>
</xsl:stylesheet>
您已经陈述了三个规则,这些规则都可以表示为模板规则。
从身份模板开始,在 3.0 中是 `
您还完成了第一条规则,用于删除根元素。
下一篇是:
这与删除根元素完全相同:
<xsl:template match="_"><xsl:apply-templates/></xsl:template>
(您不需要显式地将值移动到父元素,这会自动发生)。
最后:
我猜(根据您的示例),“所有其他”是指所有仅包含文本内容的元素。那就这样了
<xsl:template match="*[not(child::*)]">
<xsl:attribute name="{name()}" select="."/>
</xsl:template>
或者如果您仍在使用 1.0,
<xsl:template match="*[not(child::*)]">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>