防止在xsl处理中解析html实体

ajsxfq5m  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(358)

我有一个处理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.&#xA;Vestibulum pulvinar sapien at lacus lacinia,&#xA;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,无法发现是否有可能实现这种行为。
任何帮助都将不胜感激!

5fjcxozz

5fjcxozz1#

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

相关问题