2016-07-22 1 views
0

У меня есть шаблон XSLT, который передает фрагмент HTML в параметр. Мне нужно передать этот параметр другому шаблону, где он будет преобразован одним из двух способов, в зависимости от атрибута ID верхнего уровня HTML-элемента, содержащегося в параметре. Можно ли проверить содержимое параметра с помощью Xpath в XSLT 1.0? Вот мой HTML:XSLT 1.0 - Как проверить атрибут, содержащийся в параметре в инструкции xsl: when

<div id="someID">There could be many child nodes here</div> 

Вот мой XSLT тест:

<xsl:when test="$content/@id = 'someID'">...</xsl:when> 

Saxon 6.5.3 не будет работать на этом и говорит мне, чтобы переключиться использовать exsl или указать версию 1.1 (которая не имеет никакого влияния), но Мне бы очень хотелось узнать, есть ли умный способ достичь этого, используя инструменты, которые у меня есть.

+0

** 1. ** Как именно вы передаете этот параметр? ** 2. ** Пожалуйста, напишите ** точное сообщение об ошибке **. –

+0

Точная ошибка: «Чтобы использовать фрагмент дерева результатов в выражении пути, используйте exsl: node-set() или укажите version = '1.1'". Параметр объявляется в шаблоне следующим образом: . Затем этот шаблон имеет выбор/когда/иначе в основном, как показано. – wolfmason

+0

«* Мне очень хотелось бы знать, есть ли умный способ достичь этого, используя инструменты, которые у меня есть. *« Оба предложенных метода лечения ** - это инструменты, которые у вас есть в Saxon 6.5. Если вы ищете альтернативный подход, вам придется опубликовать [mcve]. –

ответ

1

Параметр объявляется в шаблоне следующим образом: <xsl:param name="content"><xsl:apply-imports/></xsl:param>.

Строго говоря, это переменная, не параметр. И его содержимое представляет собой фрагмент дерева результатов . Как сказано в сообщении об ошибке, вы должны преобразовать его в узел , прежде чем вы сможете его обработать дальше (в XSLT 1.0).

Так что-то вроде:

<xsl:variable name="content-rtf"> 
    <xsl:apply-imports/> 
</xsl:variable> 

<xsl:variable name="content" select="exsl:node-set($content-rtf)" /> 

<xsl:choose> 
    <xsl:when test="$content/div/@id = 'someID'"> 
     <!-- some result --> 
    </xsl:when> 
    <xsl:otherwise> 
     <!-- another result --> 
    </xsl:otherwise> 
</xsl:choose> 

после добавления:

xmlns:exsl="http://exslt.org/common" 
extension-element-prefixes="exsl" 

к вашему открытия <xsl:stylesheet> тега.


Непроверено, потому что воспроизводимый пример не был предоставлен.

+0

После некоторого взлома кода, у меня есть рабочее решение. Благодаря! У меня было ощущение, что XSLT 1.0 не может сделать это в одиночку. Не могу дождаться, пока у меня есть время, чтобы все до 2,0. Некоторое время ... – wolfmason

+0

У вас никогда не будет времени перейти на XSLT 2.0, если вы продолжаете тратить время на работу с ограничениями XSLT 1.0. Способ найти больше времени - это использовать более производительные инструменты. –

0
<xsl:when test="$content/div[@id = 'someID']">...</xsl:when> 
+0

Хотя этот код может помочь в решении проблемы, предоставляя дополнительный контекст относительно _why_ и/или _how_, он отвечает на вопрос, что значительно улучшит его долгосрочную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение. –

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