Выберите узел на основе значения другого узла, используя предикат xsl - PullRequest
3 голосов
/ 19 октября 2011

Аналогичная проблема с этим вопросом: XPath: выбрать узел на основе другого узла?

Цель состоит в том, чтобы выбрать узел на основе значения узла-брата - в этом случаеузел Pagetitle, основанный на значении узла Pagetype.

xpaths:

/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, если они имеют значение Pagetype "Parent".

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

Знак @ обозначает атрибуты узла. Поэтому, если вы хотите вернуть значение атрибута Pagetitle, где атрибут Pagetype равен Parent, он должен выглядеть так:

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

Полезный ресурс, который я использую для проверки своего XPATH: http://www.xmlme.com/XpathTool.aspx

0 голосов
/ 30 декабря 2014

Вот как я понимаю проблему: найдите каждую строку с дочерним элементом Pagetype из 'Parent', отобразите значение дочернего элемента Pagetitle.

Мое решение: создайте набор узлов из всех строк, которые соответствуют критериям, затем выберите значение дочернего элемента Pagetitle.

<xsl:for-each select="/dsQueryResponse/Rows/Row[Pagetype='Parent']">
    <xsl:value-of select="Pagetitle" />
</xsl:for-each>
0 голосов
/ 20 октября 2011

С предоставленным 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>
...