我下面有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
提前谢谢!
答案 0 :(得分:3)
我认为你不需要模式,只需从
开始<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
然后使用
排除您不想复制的元素<xsl:template match="childElement[not(@childElementAttribute = 'copyMe')]"/>