Я хочу выделить все тексты (включая имена узлов) под узлом - PullRequest
2 голосов
/ 25 мая 2010

В настоящее время у меня есть XML-файл, подобный этому:

<aaa>
    <b>I am a <i>boy</i></b>.
</aaa>

Как я могу получить точную строку как: <b>I am a <i>boy</i></b>.? Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 мая 2010
<aaa> 
    <b>I am a <i>boy</i></b>. 
</aaa> 

Как я могу получить точную строку как: <b>I am a <i>boy</i></b>.

Самый простой / кратчайший способ сделать это в вашем случае - вывести результат следующего выражения XPath :

/*/node()

Это означает : " Выберите все узлы, которые являются дочерними элементами верхнего элемента ."

Конечно, есть некоторые текстовые узлы только для пробелов, которые мы не хотим выделять, но XSLT может позаботиться об этом, поэтому выражение XPath так же просто, как показано выше.

Теперь, чтобы получить результат с преобразованием XSLT, мы используем следующее :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
   <xsl:copy-of select="/*/node()"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу, получается требуемый результат :

<b>I am a <i>boy</i></b>.

Примечание :

  1. Использование инструкции <xsl:copy-of> xslt (не <xsl:value-of>), которая копирует узлы , а не строковые значения.

  2. Использование команды <xsl:strip-space elements="*"/> XSLT, предписывающей процессору XSLT игнорировать любой текстовый узел, содержащий только пробелы, в документе XML.

2 голосов
/ 25 мая 2010

Вы должны сообщить XSLT, что вы также хотите копировать элементы. Это можно сделать с помощью дополнительного правила. Обратите внимание, что я использую пользовательские предложения select в своих элементах apply-templates для выбора атрибутов, а также всех объектов типа узла. Также обратите внимание, что правило для aaa имеет приоритет и не копирует сам элемент aaa в вывод.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="aaa">
    <xsl:apply-templates select="@*|node()"/>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...