有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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.&#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
  • 替换&;转换方法,但由于它不在已转换的节点上,因此不起作用
  • 禁用编码,但如上所述,更改不会在xsl转换上完成

我也研究过BaseX,但问题是相同的,我在这个库中不是足够的专家,无法发现是否有可能实现该行为

任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    当数据被解析时,<foo/><foo></foo>之间的区别就消失了(类似地,在属性周围使用单引号和双引号,在开始和结束标记中使用空格,等等),XML解析器不提供任何禁用实体引用扩展的方法。由于XSLT对XML解析器的输出进行操作,如果XSLT处理器看不到这些区别,那么它就不能保留它们

    保持实体引用的完整性是一个非常合理的要求,我通常的解决方法是使用文本编辑器将&全局替换为§(当然,在首先检查§没有出现在文件中之后),然后在完成时反转该过程

    保持起始标记和结束标记的精确词法形式是一个更值得怀疑的要求。如果您被要求这样做,那么需求来自不懂XML的人。Saxon为您提供了对输出序列化方式的大量控制(例如,序列化选项Saxon:canonical=“yes”防止在结果中使用空元素标记),但它不允许您保留输入中的任何内容。如果您被告知这是要求,那么您需要询问“为什么”和“您准备为此支付多少”——这将大大增加您的成本,因为您可能会忘记所有现成的XML处理库