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

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

Цель состоит в том, чтобы выбрать узел на основе значения родственного узла — в данном случае узел Pagetitle на основе значения узла Pagetype.

пути:

/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".


person matt    schedule 19.10.2011    source источник
comment
Пожалуйста, покажите нам образец входного XML и объясните, какие узлы вы хотите выбрать. Ваш текущий предикат [Pagetype='Parent'] проверяет наличие дочерних элементов имени Pagetype со значением Parent.   -  person Martin Honnen    schedule 19.10.2011
comment
@Martin Добавил образец xml и попытался уточнить узлы, которые я хочу выбрать.   -  person matt    schedule 19.10.2011


Ответы (3)



С предоставленным 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>
person Dimitre Novatchev    schedule 20.10.2011
comment
Я пробовал это, и на выходе все еще ничего. Даже простое значение ничего не возвращает. Все это работает, если я фильтрую с помощью xsl:ifs и не использую предикаты, поэтому я почти уверен, что xpaths верны. Возможно, это как-то связано с тем, как Sharepoint читает xsl. - person matt; 20.10.2011

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

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

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