XSLT;将转义的文本解析为节点集并提取子元素

时间:2010-05-20 12:18:21

标签: xslt xpath

我整天都在和这个问题作斗争,而且我刚刚结束了。

我有一个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 个答案:

答案 0 :(得分:3)

如果您可以使用 Saxon 9.x ,它会完全提供 saxon:parse() 扩展功能,以解决此问题。

答案 1 :(得分:2)

我所做的是在xslt中有一个msxsl脚本(这是在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