2016-12-09 3 views
0

Я делаю демо-версию IF Состояние в XSLT.
Я хочу напечатать a text, когда id соответствует node id. Я прочитал документ здесь:Почему условие IF дает неожиданный результат в XSLT?

https://msdn.microsoft.com/en-us/library/ms256209(v=vs.110).aspx

Я использовал xsl:if синтаксис. Но это не печатает значение тега <p>.
Это ссылка на XSLTTransform for my problem.

И это мой XML-файл:

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications with 
      XML.</description> 
    </book> 
    <book id="bk102"> 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen of the 
      world.</description> 
    </book> 
    <book id="bk103"> 
     <author>Corets, Eva</author> 
     <title>Maeve Ascendant</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-11-17</publish_date> 
     <description>After the collapse of a nanotechnology society 
      in England, the young survivors lay the foundation for a new 
      society.</description> 
    </book> 
</catalog> 

Я хочу показать jjj, когда книга ИД ИД 'bk101'.

И это мой XSLT-код:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="book"> 
      <xsl:if test="@id =bk101"> 
       <p>jjj</p> 
      </xsl:if> 
    </xsl:template>  
</xsl:stylesheet> 

Но он не работает, как ожидалось.

ответ

3

Правильное выражение XPath для выбора всех book узлов, где атрибут book элементов id совпадает со значением «bk101» является

book[@id='bk101'] 

Так полный шаблон XSLT будет выглядеть следующим образом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="book[@id='bk101']"> 
    <p>jjj</p> 
    </xsl:template>  
</xsl:stylesheet> 
+0

Почему нет, если условие? можем ли мы применить, если условие? – user5711656

+0

Конечно, вы можете применить if-условие. Но предикат короче. Вы можете перенести предикат на '', если хотите. Он будет выглядеть как '

jjj

'. Но в чем его смысл усложняет? – zx485

+0

Я использую, если в моем примере с тем же syntex, почему он не работает? – user5711656

1

@ zx485 правильно, что предикат, вероятно, приведет к поведению ближе к тому, что вы хотели бы в большинстве случаев.

Это сказало, что ваше выражение xsl:if будет работать - с одним изменением. Ваш текущий код включает в себя этот тест:

<xsl:if test="@id =bk101"> 

Основная проблема, которая мешает этому правильно работать в кавычки - или, вернее, что вы пропали без вести котировки.

Вашего test выше листьев bk101 неупомянуто - поэтому XPath двигатель идентифицирует это как имя элемента, так что вы завершаете сравнение значения атрибута id против значения несуществующего элемента bk101. Вам нужно поместить bk101 в кавычки, чтобы заставить механизм XPath оценивать это как строку вместо. (Одиночные кавычки здесь, чтобы избежать столкновений синтаксических с в двойные кавычки, определяющий выражение test.) Фиксированная строка будет выглядеть следующим образом:

<xsl:if test="@id = 'bk101'"> 

Запуск такой же код, переработанное добавить одиночные кавычки, в быстрое и грязное преобразование на ваш образец входного файла производит этот вывод для меня:

<?xml version="1.0" encoding="UTF-8"?> 
<p>jjj</p>