如何取消对HTML的浏览,然后用XSLT进行转换?
我是XSLT的新手,我有一个很大的XML文档,我正试图将其转换为ICML(AdobeInDesign使用的一种XML变体)。我正在处理的源文档的相关部分如下所示:如何取消对HTML的浏览,然后用XSLT进行转换?,html,xml,xslt,escaping,Html,Xml,Xslt,Escaping,我是XSLT的新手,我有一个很大的XML文档,我正试图将其转换为ICML(AdobeInDesign使用的一种XML变体)。我正在处理的源文档的相关部分如下所示: <BiographicalNote> <p>This text includes escaped HTML entities.</p> </BiographicalNote> <xsl:template match="BiographicalNo
<BiographicalNote>
<p>This text includes escaped HTML entities.</p>
</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>
<p>This text includes escaped HTML entities.</p>
</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如我所说,唯一的方法是将第一次转换保存到一个文件中,然后对生成的文档应用另一个样式表。