2013-11-14 3 views
3

Я застреваю, пытаясь написать XSLT, который будет выбирать элементы с категорией «Избранные», потому что данные внутри категории обернуты в CDATA.xslt соответствует нескольким элементам, но содержит cdata

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:template match="/"> 
     <html> 
      <body> 
      <h2>Matched Items</h2> 
      <xsl:apply-templates select="//item[category/.='Featured']"/> 
      </body> 
     </html> 
     </xsl:template> 

     <xsl:template match="item"> 
     <div class="news-item" width="100%"> 
      <div class="news-item-description"> 
      <xsl:value-of select="description"/> 
      </div> 
     </div> 
     <div class="clear" /> 
     </xsl:template> 
    </xsl:stylesheet> 

Образец моей информации. Это из блога wordpress, поэтому я не могу изменить вывод.

<items> 
     <item> 
     <category> 
      <![CDATA[ Category A ]]> 
     </category> 
     <category> 
      <![CDATA[ Featured ]]> 
     </category> 
     <description>This item should be in the output HTML</description> 
     </item> 
     <item> 
     <category> 
      <![CDATA[ Uncategorized ]]> 
     </category> 
     <category> 
      <![CDATA[ Some other category ]]> 
     </category> 
     <description>This item should NOT be in the output HTML</description> 
     </item> 
     <item> 
     <category> 
      <![CDATA[ Uncategorized ]]> 
     </category> 
     <category> 
      <![CDATA[ Featured ]]> 
     </category> 
     <description>This item should be in the output HTML</description> 
     </item> 
    </items> 

Выход я хочу выглядеть следующим образом:

<html> 
    <body> 
    <h2>Matched Items</h2> 
    <div class="news-item" width="100%"> 
    <div class="news-item-description">This item should be in the output HTML</div> 
    </div> 
    <div class="clear"></div> 
    <div class="news-item" width="100%"> 
    <div class="news-item-description">This item should be in the output HTML</div> 
    </div> 
    <div class="clear"></div> 
    </body> 
    </html> 

Это кажется, что это должно быть легко. Сочетание нескольких элементов категории плюс обложка CDATA застряло. Спасибо

+0

Какой вывод вы на самом деле получаете? –

ответ

2

//item[category/.='Featured'] даже не синтаксически не обоснован XPath, я предполагаю, что это опечатка.

В любом случае, это не касается CDATA. CDATA не имеет смысла, его не существует. Это имеет значение только при обработке синтаксического анализа документа. Когда вы будете использовать XPath на входе, он уже исчез.

Перед выполнением сравнения строк вам нужно обрезать пробелы. Попробуйте:

<xsl:apply-templates select="//item[category[normalize-space() = 'Featured']]" /> 
1

Как Томалак указал на XPath у вас есть не действует, и, вероятно, вызвал проблему даже работает XSLT. Tomalaks, вероятно, ответ, который вы ищете, но если вы не уверены, если признакам может быть в пределах, , но не единственный текст в, категория вы можете также использовать функцию XPath, например, так:

<xsl:apply-templates select="//item[category[contains(text(),'Featured')]]"/> 

Если вы изменили линию apply-templates в своем XSLT, это должно работать должным образом.

+0

Нет, вы правы, мне просто нужно выпить кофе. Здесь 6:30 утра, и я еще не должен отвечать на вопросы. Удалит мой комментарий. (По крайней мере, бит о частичных совпадениях по-прежнему остается в силе.) – Tomalak

+0

@Tomalak Кофе прочь друг, хотя его хорошо знать об этом ярлыке при создании 2.0 XSL. Спасибо :) –

+1

Но ответ на ваш вопрос: Нет, он тоже не работал бы в XSLT 2.0. Такие функции, как 'normalize-space()', не принимают последовательности из более чем одного элемента, поэтому это привело бы к ошибке во время выполнения. В функциях XSLT 1.0, которые ожидают, что строка молча преобразует первый узел аргумента набора узлов в строку, потенциально приводя к непредвиденному поведению, незаметно. XSLT 2.0 заставляет вас быть более явным с аргументами функции. – Tomalak

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