使用XSL测试节点是否包含转义XML?
我正在尝试清理一批提供给我的XML。我需要考虑三种情况:使用XSL测试节点是否包含转义XML?,xml,xslt,escaping,libxml2,libxslt,Xml,Xslt,Escaping,Libxml2,Libxslt,我正在尝试清理一批提供给我的XML。我需要考虑三种情况: 一些元素中有纯文本,例如一些文本,需要用另一个标记包装,例如一些文本 一些元素在其中转义了XML,例如,p>一些文本/p>,需要在不转义的情况下输出:一些文本 一些元素转义了需要包装的XML,例如,some em>text/em>需要变成some text 在这两种情况下都用作容器 我可以相对容易地满足条件1,我可以用禁用输出转义来满足条件2,但用这种方法无法满足条件3 如果我可以测试中的文本是否转义,但是使用的测试包含(,“<;”)
一些文本
,需要用另一个标记包装,例如一些文本
p>一些文本/p>
,需要在不转义的情况下输出:一些文本
some em>text/em>
需要变成some text
在这两种情况下都用作容器
我可以相对容易地满足条件1,我可以用禁用输出转义来满足条件2,但用这种方法无法满足条件3
如果我可以测试
中的文本是否转义,但是使用的测试包含(,“<;”)
不匹配,我认为我可以满足2(可能是3)。所以
如何测试节点中的文本是否为转义XML
三,。都需要包装并在1中禁用输出转义。不会受伤,所以我想你可以用同样的模板来处理它们
我看不到元素内容是否包含带有纯XSLT1.0含义的转义元素标记的明确检查,所以我只是尝试了一下
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="item[not(*) and not(starts-with(., '<') and substring(., string-length(.)) = '>')]">
<xsl:copy>
<p>
<xsl:value-of select="." disable-output-escaping="yes"/>
</p>
</xsl:copy>
</xsl:template>
<xsl:template match="item[not(*)
and starts-with(., '<') and substring(., string-length(.)) = '>']">
<xsl:copy>
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
哪种转变
<root>
<item>some text</item>
<item><p>some text</p></item>
<item>some <em>text</em></item>
</root>
一些文本
p> 一些文本/p>
一些em>text/em>
进入
一些文本
一些文本
一些文本
显然,它会将..>
转换为
。您可以尝试实现更多的字符串检查,但如果没有转义XML片段的完整解析器,则始终可以在字符串检查失败的情况下构造输入示例。包含(,,“”)
可以工作?您到底使用哪种XSLT 1.0处理器?您是否检查了扩展函数是否可用或是否可以轻松实现,该扩展函数将项
元素的内容解析为树片段,然后根据需要使用普通模板进行处理?@MaxToro否,因为这本质上是在搜索@MartinHonnen使用相关信息更新标记,但实际上我使用的是libxml2
和libxslt
。谢谢Martin。我得出了同样的结论,我需要解析转义内容以确保其格式正确,因此我将向我正在使用的语言(Python+lxml)添加一个回调来处理这个问题。
<html><body>
<item><p>some text</p></item>
<item><p>some text</p></item>
<item><p>some <em>text</em></p></item>
</body></html>