如何使用xsl从XML中选择一个元素?

时间:2017-11-06 21:16:13

标签: xml xslt

嘿,我遇到了XML文件的问题。 我在这里得到了一些帮助,但在那之后我又遇到了另一个问题。我试图选择XML文件中的第一个元素并将其复制到另一个位置。

这是原作:

<products>
     <product>
        <OrderingInfo>
            <item name="Part No.">12345 (text)</item>
            <item name="Part No.">12345IP (text)</item>
        </OrderingInfo>
        <varitems>
        </varitems>
    </product>

     <product>
        <OrderingInfo>
            <item name="Part No.">001 (text)</item>
            <item name="Part No.">002 (text)</item>
        </OrderingInfo>
        <varitems>
        </varitems>
     </product>
</products>

期望的输出:

<products>
     <product>
        <OrderingInfo>
            <item name="Part No.">12345 (text)</item>
            <item name="Part No.">12345IP (text)</item>
        </OrderingInfo>
        <varitems>
            <item>
              <varno>14205</varno>
              <text>text</text>

            </item>
            <item>
              <varno>14205</varno>
              <text>text</text>
            </item>
        </varitems>
    </product>

     <product>
        <OrderingInfo>
            <item name="Part No.">001</item>
            <item name="Part No.">002</item>
        </OrderingInfo>
        <varitems>
            <item>
              <varno>001</varno>
              <text>text</text>
            </item>
            <item>
              <varno>001</varno>
              <text>text</text>
            </item>
        </varitems>
     </product>
</products>

我用它来嘲笑

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="xml"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    </xsl:template>
      <xsl:template match="OrderingInfo">
        <xsl:copy-of select="."/>
        <varitems></varitems>
    </xsl:template>
    <xsl:template match="varitems">
        <xsl:copy>
            <xsl:for-each select="ancestor::product/OrderingInfo/item">
                <item>
                    <varno><xsl:value-of select="/*/product/OrderingInfo/item[1]"/></partno>
                    <vartitle><xsl:value-of select="normalize-space(translate(substring-after(current(),' '),'()',''))"/></vartitle>
                </item>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
 </xsl:stylesheet>

我尝试选择包含/*/product/OrderingInformation/item[1]部分的项目 但它始终从第一个产品

中选择OrderingInfo的第一行

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的表达式是这样的(因此,请在当前节点的父节点下获取第一个{ // ..., "workbench.colorCustomizations": { "editorError.border": "#ca2323a4", "editorError.foreground": "#ffffffb7" } } 。)

item