我遇到了 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 =“”
有谁知道如何解决这个问题?
由于
戴夫
答案 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'"/>