XSL - 使用属性复制元素并排除特定子元素

时间:2015-06-18 13:02:54

标签: xml xslt

我下面有XML。

<rootElement rootAttribute1="value1" rootAttribute2="value2">
    <childElement childElementAttribute="value">
        <grandChild>First</grandChild>
    </childElement>
    <childElement childElementAttribute="copyMe">
        <grandChild>Second</grandChild>
    </childElement>
    <childElement childElementAttribute="value">
        <grandChild>Third</grandChild>
    </childElement>
</rootElement>

我需要通过XSL处理它,应用下一个reules: 1.应该使用它的所有属性复制rootElement元素 2.刚刚复制的rootElement元素应该只包含childElement元素,这些元素具有childElementAttribute =&#34; copyMe&#34; (字符串比较&#34; copyMe&#34;只是在这种情况下,但是它是以dinamically方式生成的)(具有所有属性)。 &#34; copyMe&#34;这里只是特别的价值,但是 所以,上面的例子应该在下一个转换

<rootElement rootAttribute1="value1" rootAttribute2="value2">
    <childElement childElementAttribute="copyMe">
        <grandChild>Second</grandChild>
    </childElement>
</rootElement>

这是我试过的XSL

<!-- Copy rootElement element-->
<xsl:template match="node()|@*" mode="copyAndExclude">
    <xsl:param name="requiredAttrivuteValue"/>
    <xsl:if test="childElement[@childElementAttribute=$requiredAttrivuteValue]" >
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" mode="excludeUnnecessaryChilds" />
        </xsl:copy>
    </xsl:if>
</xsl:template>

<!-- exclude unnecessary child elements-->
<xsl:template match="node()|@*" mode="excludeUnnecessaryChilds">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" mode="excludeUnnecessaryChilds" />
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    ....
    <xsl:apply-templates select="rootElement" mode="copyAndExclude" >
        <xsl:with-param name="requiredAttrivuteValue" select="$someValue"/>
    </xsl:apply-templates>
<xsl:template>

Here someValue is generated dinamically and depends on few things, that are not significant here

提前谢谢!

1 个答案:

答案 0 :(得分:3)

我认为你不需要模式,只需从

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

然后使用

排除您不想复制的元素
<xsl:template match="childElement[not(@childElementAttribute = 'copyMe')]"/>