为后续 xslt 2 处理转义文本

unescape text for subsequent xslt 2 processing

我得到一个输入文件托管像

这样的元素
<item>
<Description>
    Intro 1
    &lt;b&gt;Title&lt;/b&gt;
    Intro 2
    &lt;ul&gt;
    &lt;li&gt;item 1&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;item 2&lt;/b&gt;&lt;/li&gt;
    &lt;/ul&gt;
    Finish
</Description>
</item>

我想创建一个 xslt2 模板或函数,将其转换为 node() 之类的

<item>
<Description>
    Intro 1
    <b>Title</b>
    Intro 2
    <ul>
    <li>item 1</li>
    <li><b>item 2</b></li>
    </ul>
    Finish
</Description>
</item>

进一步处理。

有什么实现方法的建议吗?

David Carlisle 在 XSLT 2 中实现了一个 HTML 解析器,您可以在 https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl 找到它并将其用作

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:d="data:,dpc"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:import href="https://github.com/davidcarlisle/web-xslt/raw/master/htmlparse/htmlparse.xsl"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="Description">
      <xsl:copy>
          <xsl:apply-templates select="d:htmlparse(., '', true())/node()"/>
      </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

得到类似

的结果
<item>
<Description>
    Intro 1
    <b>Title</b>
    Intro 2
    <ul>
    <li>item 1</li>
    <li><b>item 2</b></li>
    Finish
</ul></Description>

如果输入格式正确 XML 您也可以使用 XSLT 3/XPath 3 的 parse-xml-fragment 函数,但如果没有关闭 </ul> 您的示例无法解析为 XML.