使用XSLT循环并更新节点

时间:2017-05-12 07:21:26

标签: xml xslt

我的XML是:

<GrandParent>
<Parent>
    <Child1>test</Child1>
    <Child2>abc</Child2>
    <Child3>62</Child3>
    <Child4>5000061</Child4>
</Parent>
 <Parent>
        <Child1>test</Child1>
        <Child2>abc</Child2>
        <Child3>33</Child3>
        <Child4>5560853</Child4>
 </Parent>
</GrandParent>

和XSLT是:

<xsl:template match="@* | node()">
        <xsl:choose>
<xsl:when test="name() = 'Parent'">
    <Parent>
        <xsl:for-each select="*">
            <xsl:copy-of select="."/>
             <xsl:if test = "name() = 'Child3' and /GrandParent/Parent/Child3[text() = '62']/text() and
        /GrandParent/Parent/Child4/text() = '5000061'">
        <Child3>dshgfshgfhgf</Child3>
            </xsl:if>
        </xsl:for-each>
    </Parent>
</xsl:when>
<xsl:otherwise>
 <!-- skip empty and ineligible elements -->
</xsl:otherwise></xsl:choose>
</xsl:template>

结果而不是替换,我得到一个新标签,如下所示,if条件一直都是真实的:

<GrandParent>
<Parent>
    <Child1>test</Child1>
    <Child2>abc</Child2>
    <Child3>62</Child3>
    <Child3 >dshgfshgfhgf</Child3>
    <Child4>5000061</Child4>
</Parent>
 <Parent>
        <Child1>test</Child1>
        <Child2>abc</Child2>
        <Child3>33</Child3>
        <Child3>dshgfshgfhgf</Child3 >
        <Child4>5560853</Child4>
 </Parent>
</GrandParent>

我需要仅为第一个GrandParent标记获取条件,而不是第二个,并且还应替换Tag值,但不添加。

编辑:正确的结果应如下所示:

<GrandParent>
<Parent>
    <Child1>test</Child1>
    <Child2>abc</Child2>
    <Child3> dshgfshgfhgf </Child3>
    <Child4>5000061</Child4>
</Parent>
 <Parent>
        <Child1>test</Child1>
        <Child2>abc</Child2>
        <Child3>33</Child3>
        <Child4>5560853</Child4>
 </Parent>
</GrandParent> 

1 个答案:

答案 0 :(得分:0)

您的尝试因测试而失败:

/GrandParent/Parent/Child3[text() = '62']

从根节点开始,如果整个文档中至少有一个Child3节点的值为"62",则为true。同样适合您的其他测试。

我建议你简化你的方法:

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="Parent[Child4='5000061']/Child3[.='62']">
    <Child3>dshgfshgfhgf</Child3>
</xsl:template>

</xsl:stylesheet>