java阻止在xsl处理中解析html实体
我有一个处理xml文件的java程序。这些文件采用S1000D格式,用于技术文件。 我需要更新xml文件中的一些元数据,我正在使用SAXON来更新
但是Saxon所做的转换比我的xsl中的转换要多
- 它会自动关闭空标签
- 它解释文件中包含的HTML实体李>
以下是我的一个输入文件的摘录:
<dmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.s1000d.org/S1000D_4-1/xml_schema_flat/schedul.xsd">
...
<reqSpares>
<noSpares></noSpares>
</reqSpares>
<reqSafety>
<noSafety></noSafety>
</reqSafety>
...
<timeLimit>
<remarks>
<simplePara>Lorem ipsum</simplePara>
<simplePara>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vestibulum pulvinar sapien at lacus lacinia,
eu maximus arcu vestibulum.</simplePara>
</remarks>
</timeLimit>
...
以下是我转变的结果:
<dmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.s1000d.org/S1000D_4-1/xml_schema_flat/schedul.xsd">
...
<reqSpares>
<noSpares/>
</reqSpares>
<reqSafety>
<noSafety/>
</reqSafety>
...
<timeLimit>
<remarks>
<simplePara>Lorem ipsum</simplePara>
<simplePara>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vestibulum pulvinar sapien at lacus lacinia,
eu maximus arcu vestibulum.</simplePara>
</remarks>
</timeLimit>
...
即使我的xsl没有在这些行上转换任何内容,它们也是这样转换的
我的要求是,我无权以任何理由更改我正在转换的xml的结构或内容,就像在本例中所做的那样。 提供输入的服务不希望编辑输入并在xml文件的开头添加实体声明,也不希望将html实体封装在CDATA标记中
在撒克逊,我们尝试过:
- 将编码更改为US-ASCII
- 替换&;转换方法,但由于它不在已转换的节点上,因此不起作用
- 禁用编码,但如上所述,更改不会在xsl转换上完成李>
我也研究过BaseX,但问题是相同的,我在这个库中不是足够的专家,无法发现是否有可能实现该行为
任何帮助都将不胜感激
# 1 楼答案
当数据被解析时,
<foo/>
和<foo></foo>
之间的区别就消失了(类似地,在属性周围使用单引号和双引号,在开始和结束标记中使用空格,等等),XML解析器不提供任何禁用实体引用扩展的方法。由于XSLT对XML解析器的输出进行操作,如果XSLT处理器看不到这些区别,那么它就不能保留它们保持实体引用的完整性是一个非常合理的要求,我通常的解决方法是使用文本编辑器将
&
全局替换为§
(当然,在首先检查§
没有出现在文件中之后),然后在完成时反转该过程保持起始标记和结束标记的精确词法形式是一个更值得怀疑的要求。如果您被要求这样做,那么需求来自不懂XML的人。Saxon为您提供了对输出序列化方式的大量控制(例如,序列化选项Saxon:canonical=“yes”防止在结果中使用空元素标记),但它不允许您保留输入中的任何内容。如果您被告知这是要求,那么您需要询问“为什么”和“您准备为此支付多少”——这将大大增加您的成本,因为您可能会忘记所有现成的XML处理库