如何取消对HTML的浏览,然后用XSLT进行转换?

如何取消对HTML的浏览,然后用XSLT进行转换?,html,xml,xslt,escaping,Html,Xml,Xslt,Escaping,我是XSLT的新手,我有一个很大的XML文档,我正试图将其转换为ICML(AdobeInDesign使用的一种XML变体)。我正在处理的源文档的相关部分如下所示: <BiographicalNote> &lt;p&gt;This text includes escaped HTML entities.&lt;/p&gt; </BiographicalNote> <xsl:template match="BiographicalNo

我是XSLT的新手,我有一个很大的XML文档,我正试图将其转换为ICML(AdobeInDesign使用的一种XML变体)。我正在处理的源文档的相关部分如下所示:

<BiographicalNote>
 &lt;p&gt;This text includes escaped HTML entities.&lt;/p&gt;
</BiographicalNote>
<xsl:template match="BiographicalNote">
 <ParagraphStyleRange">
  <CharacterStyleRange>
   <Content>
   ...
   </Content>
  </CharacterStyleRange>
 </ParagraphStyleRange>
</xsl:template>

p此文本包括转义的HTML实体。/p
XML本身很好,但它包含的HTML被转义

下面是一个粗略的例子,我需要最终产品的外观:

<ParagraphStyleRange>
 <CharacterStyleRange>
  <Content>
   This text includes escaped HTML entities.
  </Content>
 </CharacterStyleRange>
</ParagraphStyleRange>

此文本包含转义的HTML实体。
我可以将
转换为
没有问题,但是转义的实体正在困扰我。我似乎无法去掉
标签

一些重要的考虑:

  • 源文档的HTML部分是由不同层次的人编写的,他们对HTML的熟悉程度不同,并且并不总是格式良好。不跳过整个源文档不是一个选项,因为它在运行XSLT时会导致解析器错误
  • 源文档非常大(超过120000行),因此查找和修复格式错误的HTML非常不实际且耗时。但是,在我实际需要的文件的特定部分(小于1%)内修复任何不好的HTML是更可行的
  • 虽然我想去掉
    标记,但我需要保留大多数其他标记(
    ,等等),以便以后可以将它们转换为
    标记
  • 我目前正在本地编写XSLT,并在终端(Mac)上使用xsltproc运行转换。不过,最终我将迁移到PHP系统并在服务器端运行转换
我的基本模板如下所示:

<BiographicalNote>
 &lt;p&gt;This text includes escaped HTML entities.&lt;/p&gt;
</BiographicalNote>
<xsl:template match="BiographicalNote">
 <ParagraphStyleRange">
  <CharacterStyleRange>
   <Content>
   ...
   </Content>
  </CharacterStyleRange>
 </ParagraphStyleRange>
</xsl:template>


我不知道你的问题是什么。转义文本不是XML,不能作为XML处理。没有可以选择的节点,因此,您所希望的最佳结果是:

<Content>
<p>This text includes escaped HTML entities.</p>
</Content>

此文本包含转义的HTML实体

使用以下工具很容易获得:

<Content>
    <xsl:value-of select="." disable-output-escaping="yes"/>
</Content>

如果要删除包装元素,必须使用字符串函数。如果可以确保包装元素是
(或字符串长度为1的任何其他标记),则可以执行以下操作:

<Content>
    <xsl:variable name="text" select="normalize-space(.)" />
    <xsl:value-of select="substring($text, 4, string-length($text) - 7)" disable-output-escaping="yes"/>
</Content>


或者,将此转换的结果保存到文件中,并处理结果文件。但是,这要求生成的文件必须是格式良好的XML文档—我知道您不能确定这一点。

谢谢!现在我知道它为什么不起作用了,我当然可以使用字符串函数作为一种解决方法来删除
标记。但问题是,我还需要能够转换其他标记,如
,以将其内容包装在
和其他标记中,如问题中所述。考虑到这一点,是否有可能取消HTML实体的scape,以便将它们作为XML进行处理?@JoãoFerraz如我所说,唯一的方法是将第一次转换保存到一个文件中,然后对生成的文档应用另一个样式表。