XSLT 转换:将标签值移至父级

问题描述 投票:0回答:1

您可以支持我进行以下 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>
xslt ubl
1个回答
0
投票

您已经陈述了三个规则,这些规则都可以表示为模板规则。

从身份模板开始,在 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>
© www.soinside.com 2019 - 2024. All rights reserved.