XSLT; анализировать экранированный текст в наборе узлов и извлекать подэлементы - PullRequest
2 голосов
/ 20 мая 2010

Я боролся с этой проблемой весь день и вот-вот сошел с ума.

У меня есть файл XML, в котором определенные части данных хранятся в виде экранированного текста, но сами по себе являются правильно сформированным XML. Я хочу преобразовать всю иерархию в этом текстовом узле в набор узлов и извлечь из него данные. Никакой комбинации переменных и функций я не могу придумать.

Я бы ожидал, что это сработает:

<xsl:variable name="a" select="InnerXML">
<xsl:for-each select="exsl:node-set($a)/*">
    'do something
</xsl:for-each>

Элемент ввода InnerXML содержит текст вида

<root><elementa>text</elementa><elementb><elementc/><elementd>text</elementd></elementb></root>

но это не имеет значения. Я просто хочу перемещаться по XML, как обычный набор узлов.

Куда я иду не так?

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Если вы можете использовать Saxon 9.x , он предоставляет функцию расширения saxon: parse () именно для решения это задание.

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

у меня был сценарий msxsl в xslt (это в среде Windows .NET):

  <msxsl:script implements-prefix="cs" language="C#" >
    <![CDATA[
    public XPathNodeIterator parse(String strXML)
    {
      System.IO.StringReader rdr = new System.IO.StringReader(strXML);
      XPathDocument doc = new XPathDocument(rdr);
      XPathNavigator nav = doc.CreateNavigator();

      XPathExpression expr;
      expr = nav.Compile("/");

      XPathNodeIterator iterator = nav.Select(expr);

      return iterator;
    }
    ]]>
  </msxsl:script>

тогда вы можете назвать это так:

<xsl:variable name="itemHtml" select="cs:parse(EscapedNode)" />

и эта переменная теперь содержит xml, который вы можете перебирать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...