2013-09-25 3 views
0

Рассмотрим следующий случай:XPath для выбора элементов, имеющих значение ребенка, указанного в списке

<xsl:variable name="list"> 
    <row> 
    <webid>2</webid> 
    </row> 
    <row> 
    <webid>3</webid> 
    </row> 
    <row> 
    <webid>4</webid> 
    </row> 
</xsl:variable> 

<!--pseudo code, not sure if it will work in real time--> 
<xsl:variable name="addr" select="addresses/item[not(id=$list/webid)]"/> 

Я хочу, чтобы отфильтровать те адреса элементы, которые имеют идентификатор не в $list webid collection. Будет ли сделанное мной выражение? Пожалуйста посоветуй.

ответ

2

В XSLT 1.0 объявление переменной, как это фрагмент результирующее дерево, а не набор узлов, и единственное, что вы можете сделать с ним copy-of или value-of - вы не можете перейти в него с XPath выражений. Вам нужно либо

  1. Используйте функцию расширения, такие как exslt:node-set превратить RTF в реальный узел установлен или
  2. Используйте трюк с document(''), чтобы получить доступ к самой таблице стилей как документ XML

Вариант 2 работает только в таких случаях, как ваш пример, где значение переменной - статический XML. Если у вас есть переменная, значение которой построено с использованием команд xsl: или шаблонов значений атрибутов, например.

<xsl:variable name="allNames"> 
    <xsl:for-each select="name"> 
    <person name="{.}" /> 
    </xsl:for-each> 
</xsl:variable> 

тогда вам нужно будет использовать функцию node-set. Подход document('') дал бы вам фактический элемент xsl:for-each и литеральное значение {.} для атрибута name, а не результат его оценки.

Вариант 1

Добавить xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt" в свой <xsl:stylesheet> тег, а затем использовать

<xsl:variable name="addr" select="addresses/item[ 
    not(id=exslt:node-set($list)/row/webid)]"/> 

Вариант 2

<xsl:variable name="addr" select="addresses/item[ 
    not(id=document('')//xsl:variable[name='list']/row/webid)]"/> 
0

я ставлю не (адреса/пункт [ID = $ список/webid])

Смежные вопросы