繁体   English   中英

如何在XSLT 1.0中匹配和处理未知的XML元素?

[英]How to match and process unknown XML elements in XSLT 1.0?

我有一个简单的XSLT 1.0样式表,它可以转换XHTML中的XML文档。 我确实希望能够在需要时将XML文件的内容“包含”在另一个文件中。 AFAIK在XSLT 1.0中根本不可能,因此我决定将处理移至一个简单的Java应用程序,该应用程序将对XML进行预处理,然后递归执行“ includes”,并将其传递给默认的JDK XSLT处理器。 我的文档必须符合XML模式。

最常用的元素称为“文本”,并且可以具有“ 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_and_class的模板中,将您的id和classes属性复制到生成的元素中,并且希望将未知元素映射到“文本”元素,则可以执行以下操作:

<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>

如果用命名模板处理一个特定元素的内容,则可以检入该模板是否名称匹配,并将其用于特殊处理。 然后,您只需在样式表的末尾放置<xsl:template match =“ *”>,然后从此处调用命名模板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM