2011-10-19 2 views
2

Аналогичной проблемы на этот вопрос: XPath: select a node based on another node?Выберите узел на основе значения другого узла с помощью XSLT-предикат

Объект должен выбрать узел на основе стоимости узла, в данном случае узла 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 «Родитель».

+0

Пожалуйста, покажите нам образец входного XML и объясните, какие узлы вы хотите выбрать. Ваш текущий предикат '[Pagetype = 'Parent']' проверяет дочерний элемент (ы) имени 'Pagetype', имеющий значение' Parent'. –

+0

@Martin Добавлен образец xml и попытался прояснить узлы, которые я хочу выбрать. – matt

ответ

3

Знак @ обозначает атрибуты узла. Так что если вы хотите, чтобы вернуть значение атрибута PAGETITLE, где атрибут PageType равно Родитель, следует читать:

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

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

+0

Спасибо за ссылку. Это пригодится. Я добавил фрагмент xml для уточнения. Pagetype и Pagetitle являются элементами/узлами и не имеют атрибутов. Наверное, я смущен, когда @ следует использовать. Выпущенный xpath Sharepoint Designer включает его для элемента Pagetile. – matt

+0

@_Aaron: Кажется, что OP добавил исходный XML после вашего ответа, и в нем нет атрибута Pagetype. –

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> 
+0

Я пробовал это, и выход по-прежнему ничего. Даже простая ценность - ничего не возвращает. Он работает, если я фильтрую с помощью xsl: ifs и не использую предикаты, поэтому я уверен, что xpaths верны.Может быть, это как-то связано с тем, как Sharepoint читает xsl. – matt

0

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

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

<xsl:for-each select="/dsQueryResponse/Rows/Row[Pagetype='Parent']"> 
    <xsl:value-of select="Pagetitle" /> 
</xsl:for-each> 
Смежные вопросы