使用xsl谓词基于另一个节点的值选择节点

时间:2011-10-19 16:32:19

标签: xml sharepoint xslt xpath predicates

此问题的类似问题: XPath: select a node based on another node?

对象是根据兄弟节点的值选择一个节点 - 在这种情况下是基于Pagetype节点值的Pagetitle节点。

的XPath:

/dsQueryResponse/Rows/Row/@Title
/dsQueryResponse/Rows/Row/@Pagetype
/dsQueryResponse/Rows/Row/@Pagetitle

这个xsl没有返回任何内容:

<xsl:value-of select= "/dsQueryResponse/Rows/Row[Pagetype='Parent']/@Pagetitle" />  

示例xml:

<dsQueryResponse>
       <Rows>
            <Row>
               <Title>1</Title>
               <Pagetype>Parent</Pagetype>
               <Pagetitle>title of page</Pagetitle>
            </Row>
        </Rows>
</dsQueryResponse>  

目标是在Pagetitle值为“Parent”时返回Pagetitle的值。

3 个答案:

答案 0 :(得分:3)

@符号表示节点的属性。因此,如果要返回Pagetype属性等于Parent的属性Pagetitle的值,则应显示为:

<xsl:value-of select= "/dsQueryResponse/Rows/Row[@Pagetype='Parent']/@Pagetitle" />

我用来测试XPATH的有用资源是http://www.xmlme.com/XpathTool.aspx

答案 1 :(得分:0)

使用提供的XML文档

/*/*/*[Pagetype = 'Parent']/Pagetitle

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="/*/*/*[Pagetype = 'Parent']/Pagetitle"/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<dsQueryResponse>
       <Rows>
            <Row>
               <Title>1</Title>
               <Pagetype>Parent</Pagetype>
               <Pagetitle>title of page</Pagetitle>
            </Row>
        </Rows>
</dsQueryResponse>

评估XPath表达式并输出所有(在这种情况下只有一个)选定节点

<Pagetitle>title of page</Pagetitle>

答案 2 :(得分:0)

以下是我如何理解问题:使用子元素Pagetype为&#39; Parent&#39;查找每一行,显示子元素Pagetitle的值。

我的解决方案:创建符合条件的所有行的节点集,然后选择子元素Pagetitle的值。

<xsl:for-each select="/dsQueryResponse/Rows/Row[Pagetype='Parent']">
    <xsl:value-of select="Pagetitle" />
</xsl:for-each>