拥有如下(部分)的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>
所以,它仍然不像我需要的那样。
请帮帮我:( 谢谢你的帮助。
答案 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>
申请时,它会更改节点的值