顶级的祖先或自我问题

时间:2017-12-09 03:39:39

标签: xpath

使用以下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>

1 个答案:

答案 0 :(得分:0)

//表示/descendant-or-self::node()/,因此//ancestor::*表示./descendant-or-self::node()/ancestor::x,它会查找所有后代的所有祖先,即所有后代。

摆脱使用//而不考虑其含义的习惯!