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

Проблема, аналогичная этому вопросу: 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 ответа

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

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

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

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

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

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

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