Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的XSLT转换能否输出关于无效标记的警告_Java_Xml_Xslt - Fatal编程技术网

Java中的XSLT转换能否输出关于无效标记的警告

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选择一个

我正在使用XSLT将一些XML转换为HTML。XML不是由我们创建的,它遵循一个长而复杂的模式,带有许多需要转换为适当HTML元素的自定义格式标记。当我转换它时,无效的HTML标记会被悄悄地丢弃

比如说,

<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  "&#x2014;" >
        ]>
<xsl:stylesheet
        xmlns:xsl=
                "http://www.w3.org/1999/XSL/Transform"
        version="3.0"
>

    <xsl:character-map name="cm">
        <xsl:output-character character="&mdash;" 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>