我有一个处理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
replace&translate方法,但由于它不在转换的节点上,因此不起作用
禁用编码,但如上所述,更改不会在xsl转换上完成。
我也研究过basex,但问题是一样的,我在这个库中不是足够的Maven,无法发现是否有可能实现这种行为。
任何帮助都将不胜感激!
1条答案
按热度按时间5fjcxozz1#
区别就像
<foo/>
以及<foo></foo>
在解析数据时丢失(类似地,在属性周围使用单引号和双引号,在开始和结束标记中使用空格等),并且xml解析器不提供任何禁用实体引用扩展的方法。由于xslt对xml解析器的输出进行操作,如果xslt处理器看不到这些区别,那么它就不能保留它们。保持实体引用完好无损是一个非常合理的要求,我通常的解决方法是使用文本编辑器来全局替换实体引用
&
与§
(首先检查后§
当然,不会出现在文件中),然后在完成时反转过程。保持起始和结束标记的准确词汇形式是一个更值得怀疑的要求。如果您被要求这样做,那么需求来自不懂xml的人。saxon为您提供了对如何序列化输出的大量控制(例如serialization选项)saxon:canonical=“yes”防止在结果中使用空元素标记),但不允许保留输入中的任何内容。如果您被告知这是要求,那么您需要问“为什么”和“您准备为此支付多少费用”——这将大大增加您的成本,因为您可能会忘记所有现成的xml处理库。