如何使用XSLT转换属性中的值

时间:2018-02-13 12:48:22

标签: xml xslt

拥有如下(部分)的XML代码:

    <ItemMaster>
            <Classification>
                <Codes>
                    <Code listID="Item Types" sequence="1">Cost</Code>
                    <Code listID="Item Groups" sequence="2">4ET</Code>
                    <Code listID="MRO Classes" sequence="3">*</Code>
                </Codes>
            </Classification>   
    </ItemMaster>

我想从&#34;费用&#34;更改项目类型购买&#34;购买&#34;。所以它看起来像这样:

<ItemMaster>
            <Classification>
                <Codes>
                    <Code listID="Item Types" sequence="1">Purchased</Code>
                    <Code listID="Item Groups" sequence="2">4ET</Code>
                    <Code listID="MRO Classes" sequence="3">*</Code>
                </Codes>
            </Classification>   
    </ItemMaster>

我想使用&#34;选择&#34;函数,因为我需要根据条件更改值,例如,如果项目组是4ET,则更改项类型以更改为已购买

通常我可以匹配元素。但是现在,由于数据在属性中,我不知道如何匹配和更改它

更新: 我试过这些代码

</xsl:template>
    <xsl:template
        match="//my:ItemMaster/my:Classification/my:Codes/my:Code[1]">
    <xsl:variable name="ItemGroup" 
        select="//my:ItemMaster/my:Classification/my:Codes/my:Code[@listID='Item Groups']"/>
    <xsl:choose>
        <xsl:when test="($ItemGroup='4ET')">
                <xsl:element name="Code[1]">
                    <xsl:value-of select="'Purchased'" />
                </xsl:element>              
        </xsl:when>
        <xsl:otherwise>
                <xsl:element name="Code[1]">
                    <xsl:value-of select="'Cost'" />
                </xsl:element>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

然后我得到了这个结果:

<Classification>
                <Codes>
                    Stock
                    <Code listID="Item Groups" sequence="2">4ET</Code>
                    <Code listID="MRO Classes" sequence="3">*</Code>
                </Codes>
            </Classification>

所以,它仍然不像我需要的那样。

请帮帮我:( 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

如果您只想将“成本”更改为“已购买”,则可以进行身份​​转换,即在所有节点上应用仅复制节点的递归模板,并为所有文本设置单独的模板值为“Cost”的节点。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="/">
    <xsl:apply-templates select="node()"/>
  </xsl:template>

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

    <xsl:template match="text()[. = 'Cost']">
        <xsl:text>Purchase</xsl:text>
    </xsl:template>

</xsl:stylesheet>

根据回复更新了代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="/">
    <xsl:apply-templates select="node()"/>
  </xsl:template>

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

    <xsl:template match="Code[@listID='Item Types']">
        <xsl:variable name="itemGroup" select="../Code[@listID='Item Groups']"/>
        <Code listID="Item Types" sequence="{@sequence}">
            <xsl:choose>
                <xsl:when test="$itemGroup = '4ET'">
                    <xsl:text>Purchased</xsl:text>
                </xsl:when>
                <xsl:when test="$itemGroup = 'something else'">
                    <xsl:text>...</xsl:text>
                </xsl:when>
            </xsl:choose>
            </Code>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

请检查出来;

<xsl:template match="/">
    <ItemMaster>
        <Classification>
            <Codes>
                <Code listID="Item Types" sequence="1">
                    <xsl:value-of select="'Purchase'"/>
                </Code>
                <Code listID="Item Groups" sequence="2">
                    <xsl:apply-templates select="//Code[2]"/>
                </Code>
                <Code listID="MRO Classes" sequence="3">
                    <xsl:apply-templates select="//Code[3]"/>
                </Code>
            </Codes>
        </Classification>
    </ItemMaster>
</xsl:template>

申请时,它会更改节点的值