Как я могу получить только первый, более высокий уровень, строку? - PullRequest
4 голосов
/ 25 ноября 2010

У меня есть этот (токен) XML-файл, из которого я хочу напечатать только строку «Print this», игнорируя следующее:

<tag1>
   Print this
   <tag2>
      Do not print this
   </tag2>
</tag1>

В моем XSL-файле с помощью этой команды я получаю обасодержимое tag1 и содержимое tag2 напечатано:

<xsl:value-of select="tag1"/>

Спасибо!

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

В моем XSL-файле с помощью этой команды я получить как содержимое tag1, так и содержимое tag2 напечатано:

<xsl:value-of select="tag1"/> 

Как я могу получить только первый, выше уровень, строка?

Ваш код создает строковое значение элемента tag1, которое по определению является объединением всех текстовых узлов-потомков элемента.

Для производства всего

строка "Распечатать это"

вам нужно указать выражение XPath, которое выбирает только соответствующий текстовый узел :

/tag1/text()[1]

Указание [1] необходимо для выбора только первого дочернего текстового узла, в противном случае могут быть выбраны два текстовых узла (это проблема только в XSLT 2.0, где <xsl:value-of> создает строковые значения всех узлов, указанных в select атрибут).

Далее, вышеприведенное выражение выделяет весь текстовый узел, и его строковое значение не "Print this".

Строковое значение на самом деле:

"
   Print this
   "

и именно это будет выводиться, если вы заключите <xsl:value-of> в кавычки.

Чтобы получить именно искомую строку "Print this", используйте :

"<xsl:value-of select="normalize-space(/tag1/text()[1])"/>"
3 голосов
/ 25 ноября 2010

value-of элемента даст вам значение его текстовых узлов и потомков. Если вы просто хотите непосредственный text() узел элемента, используйте это:

<xsl:value-of select="tag1/text()"/>
2 голосов
/ 25 ноября 2010

<xsl:value-of select="tag1/text()"/> выберет все текстовые узлы в tag1

...