xsl:匹配另一个xsl文件中新创建的元素

时间:2017-02-14 16:50:30

标签: xml xslt

我创建了一个XSL文件,其中包含要在xml上执行的常见转换。此文件将包含在其他几个XSL文件中,然后在这些常用规则之上添加更多模板。我遇到的问题是,我希望匹配一个共同由模板创建的元素,但是没有保证它会在更具体的xsl需要匹配时创建。 XSL:

共stylesheet.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.standards.org/Intake"
xmlns:xs="http://www.w3.org/2001/XMLSchema"  version="2.0"> <!-- xs namespace allows typed functions and parameters -->
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" /> 

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@*" />
        <xsl:apply-templates select="@*|node()" />
    </xsl:element>
</xsl:template>

<xsl:template match="@*|text()|comment()|processing-instruction()">
    <xsl:copy />
</xsl:template>

<!-- remove root -->
<xsl:template match="/*">
    <xsl:apply-templates select="node()" />
</xsl:template>

<xsl:template match="OccurrenceData">
    <xsl:element name="{local-name()}">
        <xsl:element name="custom_Occurrence">
            <!-- template adds 2 more elements to custom_Occurrence, omitted for brevity -->
            <xsl:call-template name="createOccurrenceContent" />
        </xsl:element>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>
<!-- rest of stylesheet -->
</xsl:stylesheet>

第一特定stylesheet.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:import href="common-stylesheet.xsl" />
<xsl:template match="custom_Occurrence">
    <xsl:element name="{local-name()}">
        <xsl:element name="custom_TestElement"/>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>
<!-- rest of stylesheet -->
</xsl:stylesheet>

我通过第一个特定样式表发送以下输入xml:

input.xml中

<Request>
    <RequestData>
        <Occurrence>
            <OccurrenceCd>EJ104</OccurrenceCd>
            <!-- more children -->
        </Occurrence>
        <!-- rest of input-->
    </RequestData>
</Request>

结果应如下所示:

期望-的Output.xml

<RequestData>
    <Occurrence>
        <OccurrenceCd>EJ104</Occurrence>
        <custom_Occurrence>
            <custom_TestElement />
        </custom_Occurrence>
        <!--more children -->
    </Occurrence>
    <!-- rest of output -->
</RequestData>

此时,常用模板已运行且按预期工作,但<custom_TestElement>中缺少<custom_Occurrence>。是否有办法将公共文件包含在特定的xsl文件中,并且确保在更具体的文件开始匹配新元素之前运行公共文件模板?这可能在一个文件中,或者我是否必须将转换拆分为它们自己的步骤,即首先运行公共转换,然后将xml管道输入更具体的xml?

注意:我使用<xsl:element name="{local-name()}">和调整后的身份转换以及额外的模板格式,因为源xml没有命名空间,我在常见的xsl中应用了一个;如果没有这些,命名空间将应用于每个元素,使用空值或完整值。另外,我使用Saxon-HE v9.7.0-8进行转换

编辑:我无法将custom_OCCurrence的创建移动到更具体的样式表;元素块及其内容在所有特定样式表中共享,每个样式表向该元素添加不同的元素和值&#34;块&#34;取决于使用哪一个

1 个答案:

答案 0 :(得分:1)

您需要使用

中的变量
<xsl:variable name="temp">
        <xsl:element name="custom_Occurrence">
            <!-- template adds 2 more elements to custom_Occurrence, omitted for brevity -->
            <xsl:call-template name="createOccurrenceContent" />
        </xsl:element>
</xsl:variable>

<xsl:apply-templates select="$temp/node()"/>

如果要将模板应用于XSLT创建的节点。