Как создать набор узлов XSL из строки

Я не могу создать набор узлов XSL из строки. Я могу создать набор узлов из фрагмента дерева результатов. Эта таблица стилей показывает обе попытки.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
version="1.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:variable name="rtf">
      <root>
          <child>
          </child>
      </root>
  </xsl:variable>

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

  <xsl:variable name="str" select="'&lt;root&gt;&lt;child&gt;&lt;/child&gt;&lt;/root&gt;'" />

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

  <xsl:template match="/">
    <xsl:copy-of select="$rtfNs" />
    <xsl:copy-of select="$rtfNs/root/child" />
    <xsl:copy-of select="$strNs" />
  </xsl:template>

</xsl:stylesheet>

Производит

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:exsl="http://exslt.org/common">
   <child/>
</root>
<child xmlns:exsl="http://exslt.org/common"/>&lt;root&gt;&lt;child&gt;&lt;/child&gt;&lt;/root&gt;

Код показывает, что набор узлов можно создать из RTF и использовать в атрибуте select. Попытка создать набор узлов из строки приводит к строке со встроенными объектами (т. е. и ). Строка не может быть определена без использования сущностей. Этот вопрос представляет собой упрощение попытки передать внешнюю строку в таблицу стилей из .NET System.Xml.Xsl и преобразовать эту строку в набор узлов.


person DSHCS    schedule 03.09.2019    source источник
comment
Если вы используете XSLT 1.0 и ваши входные данные представляют собой строку, содержащую экранированный XML, вам нужно выполнить преобразование в два прохода: в первом проходе используйте disable-output-escaping, чтобы отменить экранирование строки и сохранить результат в файл; во втором проходе обработайте полученный файл, используя другую таблицу стилей XSLT.   -  person michael.hor257k    schedule 04.09.2019
comment
Просто тонкий момент, переданная строка не содержала escape-символов. Я провел эксперимент с использованием XPATH translate(), и символы, которые экранируются на выходе, не экранируются в переданной строке. Они экранируются на выходе (xsl:copy-of или value_of), а функция набора узлов должна возвращать строку вместо набора узлов, и она экранируется на выходе.   -  person DSHCS    schedule 04.09.2019
comment
Боюсь, вы упускаете суть: ваша переменная $str содержит экранированные символы. Точно так же, если вы передаете ту же строку в качестве параметра или получаете ее из раздела CDATA во входном XML, синтаксический анализатор XML интерпретирует ее как строку, а не разметку. Строка не может содержать символ <, если он не экранирован. Функция node-set() здесь совершенно неуместна.   -  person michael.hor257k    schedule 04.09.2019


Ответы (1)


Я получил решение на стороне .NET, но хочу также получить ответы на стороне XSL...

Dim objXmlDoc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
objXmlDoc.LoadXml("<root><child></child></root>")
Dim objXmlNav As System.Xml.XPath.XPathNavigator = objXmlDoc.CreateNavigator()
objXmlNav.MoveToRoot()

Dim objValidationArgList As New System.Xml.Xsl.XsltArgumentList
objValidationArgList.AddParam("test", "", objXmlNav)

Это передало RTF в таблицу стилей и при обработке с помощью node-set($test) привело к набору узлов, который можно было использовать точно так же, как созданный из внутреннего (xsl:variable) RTF.

person DSHCS    schedule 03.09.2019