使用 xslt 在现有元素下方添加新元素

Add new element below existing element using xslt

我有一个名为“Dispute”的元素,想在该元素下方添加新的元素名称“Records”。 eg:当前的XML就是这种使用ssis技术的格式

            <root>
            <Grade></Grade>
            <Fuel>
                <Quantity/>
                <Additional/>
                <Dispute>0</Dispute>
            </Fuel>
            <Fuel>
                <Quantity/>
                <Additional/>
                <Dispute>1</Dispute>
            </Fuel>
            </root>
            
            
            Need to add new element under dispute.

            <root>
            <Grade></Grade>
            <Fuel>
                <record>1</record>
                <Quantity/>
                <Additional/>
                <Dispute>0</Dispute>
                
            </Fuel>
            <Fuel>
               <record>2</record>
                <Quantity/>
                <Additional/>
                <Dispute>1</Dispute>

            </Fuel>
            </root>

XSLT 无法添加属性值为 1 和 2 的记录元素

            <?xml version="1.0" encoding="UTF-8"?>
            <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
               <!-- Identity transform -->
               <xsl:template match="@* | node()">
                  <xsl:copy>
                     <xsl:apply-templates select="@* | node()"/>
                  </xsl:copy>
               </xsl:template>

               <xsl:template match="Dispute">
               <Dispute>0</Dispute>
               copy-of select="."/>
                  <record>1</record>
               </xsl:template>

               <xsl:template match="Dispute">
               <Dispute>1</Dispute>
               copy-of select="."/>
                  <record>2</record>
               </xsl:template>
            </xsl:stylesheet>

试试这样的东西:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Dispute">
    <xsl:copy-of select="."/>
    <record>
        <xsl:number count="Fuel"/>
    </record>
</xsl:template>

</xsl:stylesheet>

您没有指定填充添加的 record 元素的确切逻辑。上面的例子将使用序号。


已添加:

I want record element just below the fuel element

您可以将其重述为“就在 Quantity 元素之前”,只需将第二个模板替换为:

<xsl:template match="Quantity">
    <record>
        <xsl:number count="Fuel"/>
    </record>
    <xsl:copy-of select="."/>
</xsl:template>

或者您可以更改策略并使用:

<xsl:template match="Fuel">
    <xsl:copy>
        <record>
            <xsl:number/>
        </record>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>