XSLT - 推断考虑下面的XML输入孩子
问题描述:
<Sections>
<Section number="1">
<Step number="1">
<SubStep number="1" Pass="True">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="True"/>
</SubStep>
</Step>
<Step number="2">
<SubStep number="1" Pass="False">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="False"/>
</SubStep>
</Step>
</Section>
</Sections>
我怎样才能把它转换为:
<Sections Pass="False">
<Section number="1" Pass="False">
<Step number="1" Pass="True">
<SubStep number="1" Pass="True">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="True"/>
</SubStep>
</Step>
<Step number="2" Pass="False">
<SubStep number="1" Pass="False">
<SubSubStep number="1" Pass="True"/>
<SubSubStep number="2" Pass="False"/>
</SubStep>
</Step>
</Section>
</Sections>
我想推断子女的父或母的结果。如果任何一个孩子有Pass =“False”结果,那么父结果将是Pass =“False”。向后递归?
答
如下你可以这样做:
使用identity transform一切从输入复制到输出,并且
元素节点没有
Pass
属性,添加它。如果儿童中至少有一个Pass
属性的值为False
,则将其设置为False
,否则将其设置为True
。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- set missing Pass attribute -->
<xsl:template match="*[not(@Pass)]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="Pass">
<xsl:choose>
<xsl:when test=".//*[@Pass = 'False']">False</xsl:when>
<xsl:otherwise>True</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
+0
谢谢。这正是我所期待的 – 2009-10-06 18:10:56
答
可以使用“.//node()[ @Pass='True' ]
”XPath表达式查看当前节点的任何子节点是否为“真”。
XSLT是不是转化空白非常好,它的工作更好的XML。 :) – 2009-10-05 16:24:56
不需要转换。 :)我认为你需要编辑这个来包含你的XML和期望的输出。 – 2009-10-05 16:25:32
哈哈...努力尝试添加代码块后我终于给了,并决定阅读指导方针:) – 2009-10-06 18:15:05