给出以下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”。向后递归?
答案 0 :(得分:0)
您可以使用“.//node()[ @Pass='True' ]
”XPath表达式查看当前节点的任何子节点是否为“True”。
答案 1 :(得分:0)
你可以这样做:
使用identity transform复制从输入到输出的所有内容,
对于没有Pass
属性的元素节点,请添加它。如果子项中至少有一个False
属性值Pass
,则设置为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>