如何使用xslt 1.0进行模板匹配

时间:2016-01-03 22:03:14

标签: xslt conditional xslt-1.0

我有一个要求,我根据根元素标签处理消息,为此我根据root标签元素创建了3个不同的模板匹配。我想知道如果客户端发送的是与根标记元素不匹配的不同消息,如何处理消息。

输入:

<?xml version="1.0"?>
<process1 xmlns="http://www.openapplications.org/oagis/10" systemEnvironmentCode="Production" languageCode="en-US">
    <Appdata>
        <Sender>
        </Sender>
        <Receiver>
        </Receiver>
        <CreationDateTime/>
    </Appdata>
</process1>

第二条消息:除了根标记process2process3

之外,所有内容都相同

代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/*[local-name()='proces1']">
        <operation>dosomthing</operation>
    </xsl:template>
    <xsl:template match="/*[local-name()='process2']">
        <operation>dosomthing2</operation>
    </xsl:template>
    <xsl:template match="/*[local-name()='process2']">
        <operation>blah blah</operation>
    </xsl:template>
</xsl:stylesheet>

我的问题是,如果邮件与3个模板 process1,process2,process3 不匹配,我想要处理邮件。

任何人都可以建议如何实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

首先,不要使用local-name()。很容易声明和使用正确的命名空间,做到这一点。

其次,只需创建一个不太具体的模板来捕获任何具有您未预料到的名称的文档元素(参见下面的第4个模板):

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:oagis="http://www.openapplications.org/oagis/10"
>
    <xsl:template match="/oagis:process1">
        <operation>dosomething1</operation>
    </xsl:template>
    <xsl:template match="/oagis:process2">
        <operation>dosomething2</operation>
    </xsl:template>
    <xsl:template match="/oagis:process3">
        <operation>dosomething3</operation>
    </xsl:template>
    <xsl:template match="/*" priority="0">
        <!-- any document element not mentioned above -->
    </xsl:template>
</xsl:stylesheet>

注意:如果前三个模板都是相同的,您可以将它们合并为一个。

<xsl:template match="/oagis:process1|/oagis:process2|/oagis:process3">
    <operation>dosomething</operation>
</xsl:template>