根据另一个子节点的值修改子节点

时间:2014-04-05 22:32:35

标签: xslt

我有下面的XML。我想处理每个fields元素,并根据elem3的值,用剩余的元素做各种事情:
案例1:删除elem1,将elem2修改为不同的值
案例2:添加elem5,将elem1修改为不同的值

我可能在每个元素下都有各种子节点,所以我不能总是依赖于elem1和elem2固定的名称。

<Sample>
  <fields>
    <elem1>Something1</elem1>
    <elem2>SomethingElse1</elem2>
    <elem3>type1</elem3>
  </fields>
</Sample>
<Sample>
  <fields>
    <elem1>Something2</elem1>
    <elem2>SomethingElse2</elem2>
    <elem3>type2</elem3>
    <elem4>sss</elem4>
  </fields>
</Sample>
<Sample>
  <fields>
    <elem1>Something3</elem1>
    <elem2>SomethingElse3</elem2>
    <elem3>type3</elem3>
  </fields>
</Sample>

我已经能够识别出我想要做的字段元素,如下所示:

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

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

    <xsl:template match="fields[elem3='type1']">
    </xsl:template>

    <xsl:template match="fields[elem3='type2']">
    </xsl:template>

</xsl:stylesheet>

但是现在我试图找出个人模板中的内容,以便按照自己的意愿进行操作。

1 个答案:

答案 0 :(得分: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>

<!-- suppress -->
<xsl:template match="elem1[../elem3='type1']"/>

<!-- modify value -->
<xsl:template match="elem2[../elem3='type1']/text()">
    <xsl:value-of select="'New Value'"/>
</xsl:template>

<!-- add elem -->
<xsl:template match="fields[elem3='type2']">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <elem5/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

但是,我不确定你的意思是:

  

我不能完全依赖于被修复为elem1和elem2的名称。

那么,可以依赖什么?