Java中的XSLT转换能否输出关于无效标记的警告
我正在使用XSLT将一些XML转换为HTML。XML不是由我们创建的,它遵循一个长而复杂的模式,带有许多需要转换为适当HTML元素的自定义格式标记。当我转换它时,无效的HTML标记会被悄悄地丢弃 比如说,Java中的XSLT转换能否输出关于无效标记的警告,java,xml,xslt,Java,Xml,Xslt,我正在使用XSLT将一些XML转换为HTML。XML不是由我们创建的,它遵循一个长而复杂的模式,带有许多需要转换为适当HTML元素的自定义格式标记。当我转换它时,无效的HTML标记会被悄悄地丢弃 比如说, <P>(1) something something <PRTPAGE P=\"783\"/> something else. </P> 这有点太长,无法在注释中编写,但如果XSLT正在删除元素,那是因为您没有添加任何模板来显式复制它们。当XSLT选择一个
<P>(1) something something <PRTPAGE P=\"783\"/> something else. </P>
这有点太长,无法在注释中编写,但如果XSLT正在删除元素,那是因为您没有添加任何模板来显式复制它们。当XSLT选择一个没有匹配模板的元素时,它会使用其内置模板跳过元素,只复制它们的后代文本节点 您可以尝试做的是向XSLT添加一个通用模板以匹配所有其他元素,并使用xsl:message写出一条列出元素名称的消息
<xsl:template match="*">
<xsl:message>
<xsl:text>Dropping </xsl:text>
<xsl:value-of select="name()" />
</xsl:message>
<xsl:apply-templates />
</xsl:template>
请注意,我对javax.xml.transform.Transformer一无所知,无法说明如何实际读取这些消息。如果删除了PRTPAGE,那是因为您没有向XSLT添加代码来告诉它被复制。XSLT的内置模板不会复制元素,只复制文本节点。如果您使用的是XSLT3.0,那么只需添加,就可以告诉XSLT也要复制元素。谢谢顺便问一下,你确定这只是删除了PRTPAGE,而不是P吗?我实际上正在处理
标签的主体。只是想把背景故事缩短一点。如果我不启用浅层复制,是否有办法知道何时/哪些标记被删除,即哪些标记不匹配?您的XSL正在将U+2014字符替换为…U+2014字符。在XML文档中,编写&x2014;和写一个-,完全一样。换句话说,您的字符映射什么也不做。Java中的内置XSLT处理器是ApacheXalan的内部版本,ApacheXalan是不支持xsl:character映射的XSLT1处理器。当您使用version=3.0时,Xalan将在向前兼容的处理模式下运行,并忽略xsl:character映射。这就是你想要的吗?还是将XSLT 3与Saxon 9一起使用?如果是这样的话,你看,那就行了。消息被打印到STDERR。这对我的目的有用。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stylesheet [
<!ENTITY mdash "—" >
]>
<xsl:stylesheet
xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform"
version="3.0"
>
<xsl:character-map name="cm">
<xsl:output-character character="—" string="—"/>
</xsl:character-map>
<xsl:output use-character-maps="cm" method="xml" />
<xsl:template match="//E[@T='03']">
<span class="italic underline">
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="*">
<xsl:message>
<xsl:text>Dropping </xsl:text>
<xsl:value-of select="name()" />
</xsl:message>
<xsl:apply-templates />
</xsl:template>