在 xsl 转换过程中丢失或跳过的 XML 标记

XML tags missing or skipped during xsl transformation

提问人:Rahul 提问时间:6/21/2023 最后编辑:Rahul 更新时间:6/21/2023 访问量:70

问:

我们正在执行 xsl 转换以将 hexcode 实体转换为 mdash。我们还将 xml 中的所有内容转换为输出为 &。 这种转换按预期发生,但与此同时,一些实体被转义为,就像转换为一样,更多的实体和更多的实体的情况类似。&''s§

此外,所有标记都从 xml 中跳过,只有内容在输出中呈现,标签被跳过。

前>

xsl 转换前的输入:-

<?xml version="1.0" encoding="UTF-8"?><name>abc<name>

xsl 转换后的输出:-

abc

以下是使用的 xsl:-

<xsl:stylesheet version='3.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
  
<xsl:output method="xml" omit-xml-declaration="no" use-character-maps="mdash amp" />

<xsl:character-map name="mdash">
  <xsl:output-character character="&#x2014;" string="&amp;mdash;" />
</xsl:character-map>

<xsl:character-map name="amp">
  <xsl:output-character character="&amp;" string="&amp;" />
</xsl:character-map>

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

</xsl:stylesheet>

转型就是这样发生的:-

TransformerFactory tfactory = new net.sf.saxon.TransformerFactoryImpl();
InputStream xsl_stream = new BufferedInputStream(new FileInputStream(xsl_path));
StreamSource xsl_source = new StreamSource(xsl_stream, xsl_path);
Transformer transformer = tfactory.newTransformer(xsl_source);
InputStream xml_inputsource = new BufferedInputStream(new FileInputStream(output_file));
StreamSource xmlSource = new StreamSource(xml_inputsource, output_file);
StreamResult xmlResult = new StreamResult(finalFile);
transformer.transform(xmlSource, xmlResult); 

有没有办法在输出中保留 xml 标签并取消转义实体,即 应保留在 XML 转换之后。所有实体在转换后都应保持原样。&apos;&apos;

XSLT XML 解析 Saxon Saxparser XSLT-3.0

评论

0赞 Martin Honnen 6/21/2023
您究竟如何运行转换?
0赞 michael.hor257k 6/21/2023
此处显示的输入不是格式正确的 XML,并且会产生错误,而不是您声明的结果。
0赞 Rahul 6/21/2023
@MartinHonnen,我使用了 TransformerFactory 实例,并从 TransformerFactory 引用创建一个 transformer 对象,然后对其调用 transform 函数。
0赞 Rahul 6/21/2023
@michael.hor257k,我现在已经更新了输入xml。
0赞 Rahul 6/21/2023
@MartinHonnen,在问题描述中也分享了转换细节。

答:

2赞 michael.hor257k 6/21/2023 #1

您的问题被标记为 和 ,这没有任何意义。saxonxalan

如果您使用仅支持 XSLT 1.0 的 Xalan 来处理不包含模板的 XSLT 3.0 样式表,则结果将是根元素的字符串值 - 请参阅:https://www.w3.org/TR/1999/REC-xslt-19991116/#built-in-rule

评论

0赞 Rahul 6/21/2023
使用撒克逊人,因此从标签中删除了 Xalan。
1赞 Michael Kay 6/21/2023 #2

所有实体在转换后都应保持原样

这是无法实现的,因为实体和字符引用甚至在转换开始之前就被 XML 解析器扩展了。

最好的办法是用于转换要显示为实体引用的字符:xsl:character-map

<xsl:character-map name="specials">
  <xsl:output-character character="&#x2014;" string="&amp;mdash;" />
  <xsl:output-character character="&#x00A7;" string="&amp;sect;" />
  .. etc ..
</xsl:character-map>

我不知道你想通过输出 .这似乎被误导了。但老实说,我不太确定你想通过这些达到什么目的。告诉我们你想要什么输出是一回事,但真正的问题是为什么?&&amp;