xsl:include模板没有默认名称空间导致xmlns =“”

时间:2010-04-06 13:20:05

标签: xslt namespaces xml-namespaces

我遇到了 xsl:include 和默认命名空间的问题,导致最终的xml文档包含 xmlns =“”

的节点

在这个synario中,我有一个源文档,它是Plain Old XML,没有命名空间:

<?xml version="1.0" encoding="UTF-8"?>
<SourceDoc>
    <Description>Hello I'm the source description</Description>
    <Description>Hello I'm the source description 2</Description>
    <Description/>
    <Title>Hello I'm the title</Title>
</SourceDoc>

本文档转换为 2个不同的 xml文档,每个文档都带有自己的默认命名空间

第一份文件:

<?xml version="1.0" encoding="utf-8"?>
<OutputDocType1 xmlns="http://MadeupNS1">
   <Description >Hello I'm the source description</Description>
   <Description>Hello I'm the source description 2</Description>
   <Title>Hello I'm the title</Title>
</OutputDocType1>

第二份文件:

<?xml version="1.0" encoding="utf-8"?>
<OutputDocType2 xmlns="http://MadeupNS2">
   <Description>Hello I'm the source description</Description>
   <Description>Hello I'm the source description 2</Description>
   <DocTitle>Hello I'm the title</DocTitle>
</OutputDocType2>

我希望能够在两个转换中重复使用说明的模板。因为这两种类型的文档都是相同的逻辑。为此,我在其他2个转换中创建了一个 xsl:include d的模板文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="xml"/>

    <xsl:template match="Description[. != '']">
        <Description>
            <xsl:value-of select="."/>
        </Description>
    </xsl:template>
</xsl:stylesheet>

现在的问题是这个共享转换不能有一个默认的命名空间,因为它会有所不同,具体取决于调用它的调用转换。

E.g。第一次文件转换:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes" method="xml"/>
    <xsl:template match="SourceDoc">
        <OutputDocType1 xmlns="http://MadeupNS1">

            <xsl:apply-templates select="Description"/>
            <xsl:if test="Title">
                <Title>
                    <xsl:value-of select="Title"/>
                </Title>
            </xsl:if>
        </OutputDocType1>
    </xsl:template>

    <xsl:include href="Template.xsl"/>
</xsl:stylesheet>

这实际上输出如下:

<?xml version="1.0" encoding="utf-8"?>
<OutputDocType1 xmlns="http://MadeupNS1">
   <Description xmlns="">Hello I'm the source description</Description>
   <Description xmlns="">Hello I'm the source description 2</Description>
   <Title>Hello I'm the title</Title>
</OutputDocType1>

这是问题所在。在描述行上,我得到一个 xmlns =“”

有谁知道如何解决这个问题?

由于

戴夫

1 个答案:

答案 0 :(得分:3)

包含文字结果元素Description的第一个xslt没有默认命名空间。因此,此元素不在命名空间中,并且通过xmlns=""显式呈现。

Namespaces in XML 1.0的第6.2节说:

  

默认情况下的属性值   名称空间声明可以为空。   这具有相同的效果   那里的声明范围   没有默认命名空间。

为了控制在包含的样式表中生成的命名空间,您需要使用变量或参数将namespace-uri传递给其模板。

<!-- in the included stylesheet -->
<xsl:template match="Description[. != '']">
    <xsl:element name="Description" namespace="{$output-namespace}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

<!--
    and add this to your First Document Transformation stylesheet
    as a top level element under xsl:stylesheet
-->
<xsl:variable name="output-namespace" select="'http://MadeupNS1'"/>