如何在XSLT中应用多个导入以生成xml

时间:2018-08-01 10:12:36

标签: xml xslt

我的xml只选择最后一个import(IdentifierXSLT),而不选择上面的那个;我想导入所有其他导入。我可以在需要导入的所有xslt中使用apply模板吗?  我该如何实现?任何帮助,将不胜感激。

我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <xsl:output method="xml" indent="yes"/>
        <xsl:import href="DocumentHeaderXSLT.xsl"/>
            <xsl:import href="IdentifierXSLT.xsl"/>
        <xsl:template match="/">
            <xsl:element name="ApplicationBatch">
                <xsl:namespace name="xsi" select="'http://www.w3.org/2001/XMLSchema-instance'"/>
                <xsl:namespace name="xsd" select="'http://www.w3.org/2001/XMLSchema'"/>
                <xsl:apply-imports/>
            </xsl:element>
        </xsl:template>
    </xsl:stylesheet>

我的Xml:

<?xml version="1.0" encoding="UTF-8"?>
<ApplicationBatch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <DocumentHeader>
      <SchemaName xsi:type="xsd:string">AcmeCorp_MotorApplicationRequest</SchemaName>
      <SchemaVersion xsi:type="xsd:string">v1_0</SchemaVersion>
   </DocumentHeader>
   <Identifier Type="LenderAssigned" UniqueID="ACMECORP"/>
   <Submission>
      <Date>2017-03-07</Date>
      <Time>09: 07: 39.1373551+11: 00</Time>
   </Submission>
</ApplicationBatch>

DocumentHeaderXSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:element name="DocumentHeader">
            <xsl:element name="SchemaName" >
                <xsl:attribute name="xsi:type">xsd:string</xsl:attribute>
                <xsl:value-of select="/ApplicationBatch/DocumentHeader/SchemaName"/>
            </xsl:element>
            <xsl:element name="SchemaVersion">
                <xsl:attribute name="xsi:type">xsd:string</xsl:attribute>
                <xsl:value-of select="/ApplicationBatch/DocumentHeader/SchemaVersion"/>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

IdentifierXSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <xsl:element name="Identifier">
            <xsl:attribute name="Type">
                <xsl:value-of select="/ApplicationBatch/Identifier/@Type"/>
            </xsl:attribute>
            <xsl:attribute name="UniqueID">
                <xsl:value-of select="/ApplicationBatch/Identifier/@UniqueID"/>
            </xsl:attribute>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

预期输出:

<ApplicationBatch ProductionData="Yes"
                  xmlns:xsd="htt://www.w3.org/2001/XMLSchema"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <DocumentHeader>
        <SchemaName xsi:type="xsd:string">AcmeCorp_MotorApplicationRequest</SchemaName>
        <SchemaVersion xsi:type="xsd:string">v1_0</SchemaVersion>
    </DocumentHeader>
    <Identifier Type="BrokerAssigned"
                UniqueID="Ref24723"/>
</ApplicationBatch>

我的输出:

<ApplicationBatch ProductionData="Yes"
                  xmlns:xsd="htt://www.w3.org/2001/XMLSchema"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Identifier Type="BrokerAssigned"
                UniqueID="Ref24723"/>
</ApplicationBatch>

1 个答案:

答案 0 :(得分:0)

使用xsl:apply-templates时,将考虑所有匹配的模板规则,并且 import优先级最高的规则将获胜。如果要对同一节点执行多个模板规则,则有多种选择:您可以在不同的模式中调用apply-templates两次,也可以让一个模板规则使用xsl:apply-importsxsl:next-match