Java 如何匹配和处理XSLT1.0中未知的XML元素?

Java 如何匹配和处理XSLT1.0中未知的XML元素?,java,preprocessor,xslt-1.0,Java,Preprocessor,Xslt 1.0,我有一个简单的XSLT1.0样式表,可以在XHTML中转换XML文档。我真的希望能够在需要时在另一个XML文件中包含XML文件的内容。因为在XSLT1.0中根本不可能这样做,所以我决定将处理转移到一个简单的Java应用程序,该应用程序将预处理XML,递归地执行include,并将其传递给默认的JDK XSLT处理器。我的文档必须符合XML模式 最常用的元素称为text,可以具有id和/或class属性,用于使用CSS的XHTML样式。此元素根据上下文转换为p、div或span 我想补充的是,能够

我有一个简单的XSLT1.0样式表,可以在XHTML中转换XML文档。我真的希望能够在需要时在另一个XML文件中包含XML文件的内容。因为在XSLT1.0中根本不可能这样做,所以我决定将处理转移到一个简单的Java应用程序,该应用程序将预处理XML,递归地执行include,并将其传递给默认的JDK XSLT处理器。我的文档必须符合XML模式

最常用的元素称为text,可以具有id和/或class属性,用于使用CSS的XHTML样式。此元素根据上下文转换为p、div或span

我想补充的是,能够在输入文件中定义未知元素,并将它们转换为文本元素进行进一步处理。如果未知元素的名称以大写字母开头,则它将成为文本,id设置为原始名称。否则,类设置为原始名称的文本。未知元素中的所有其他内容都应保持原样,然后XSLT应将其处理为输入文件中的原始内容。换句话说,我希望将所有未知元素转换为有效的XML文档,然后使用样式表处理它


这可以在XSLT中完成,可能是在预处理样式表中,还是应该在Java中作为预处理来完成?这里的表现并不重要。我更喜欢XSLT解决方案,但如果它比Java复杂得多,我就不喜欢了。

好吧,既然没有人回答,我就试一下。虽然在Java中更容易做到这一点,但它有一个主要缺点:因为代码需要知道有效的元素,以便识别未知的元素,因此您必须在代码中硬编码这些元素,并且在XSLT模板更改时必须重新编译

所以,我尝试了XSLT,它也可以工作。假设你有:

<xsl:template match="text">
    *processing*
    <xsl:call-template name="id_and_class"/>
    *processing*
</xsl:template>
如果名为id_和_class的模板复制生成元素中的id和class属性,并且希望将未知元素映射到文本元素,则可以执行以下操作:
<xsl:template match="text">
    <xsl:call-template name="text_processing"/>
</xsl:template>

<xsl:template name="text_processing">
    *processing*
    <xsl:call-template name="text_id_and_class"/>
    *processing*
</xsl:template>
...
<xsl:template name="text_id_and_class">
     <xsl:choose>
        <!-- If name() is not "text", then we have an unknown element. -->
        <xsl:when test="name()!='text'">
            <!-- Processing of ID and class omitted ... -->
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="id_and_class"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
...
<!-- MUST BE LAST : Process unknown elements like a "text" element. -->
<xsl:template match="*">
   <xsl:call-template name="text_processing"/>
</xsl:template>

如果您使用命名模板处理一个特定元素的内容,那么如果名称匹配,您可以签入该模板,并将其用于特殊处理。然后,您只需在样式表的末尾添加一个,然后从那里调用命名模板。

还可以显式地设置模板优先级,而不是隐式地按文档顺序设置,以避免!或者通过特殊性。