使用以下XML,顶级返回所有级别的节点。顶级没有祖先,为什么我会得到它的孩子呢?
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<WBSs>
<WBS GUID="2">
<Name>work</Name>
<WBSs>
<WBS GUID="1">
<Name>Wall</Name>
<ParentWBS>2</ParentWBS>
</WBS>
<WBS GUID="2">
<Name>South Wall</Name>
<ParentWBS>2</ParentWBS>
</WBS>
<WBS GUID="3">
<Name>North Wall</Name>
<ParentWBS>2</ParentWBS>
</WBS>
</WBSs>
</WBS>
</WBSs>
XPATH 注意:应用模板已打开.// WBS
<xsl:variable name="wbsCode" select=".//ancestor-or-self::WBS/@GUID[1]"/>
注意:我在xpath表达式后面紧跟xslt指令以对节点进行strinify并包含'。'。
结果
2.1.2.3
2.1
2.2
2.3
期望的结果
2
2.1
2.2
2.3
XSLT
<xsl:variable name="WBS_ELEMENT_TABLE">
<xsl:apply-templates select=".//WBS" mode="I_WBS_ELEMENT">
<xsl:with-param name="ProjectId" select="$ProjectId"/>
</xsl:apply-templates>
</xsl:variable>
<xsl:template match="WBS" mode="I_WBS_ELEMENT">
<xsl:param name="ProjectId"/>
<xsl:variable name="wbsCode" select=".//ancestor-or-self::WBS/@GUID[1]"/>
<xsl:variable name="temp2" select="string-join(($wbsCode), '.')"/>
<WBS_ELEMENT>
<xsl:value-of select="$temp2"/>
</WBS_ELEMENT>
</xsl:template>
答案 0 :(得分:0)
//
表示/descendant-or-self::node()/
,因此//ancestor::*
表示./descendant-or-self::node()/ancestor::x
,它会查找所有后代的所有祖先,即所有后代。
摆脱使用//
而不考虑其含义的习惯!