Выберите узел на основе значения другого узла, используя предикат 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>