我使用xslt文件转换xml文件集,xml中的一些标记在另一个命名空间中定义。
xslt所做的是从AddBooks元素标签首先复制所有内容,除了bookattach元素,其中属性bookname =' AA12'然后构建一个新的元素bookattach,其中bookname =" AA12"在所有情况下,并将bookname =" AA12"的所有孩子都复制到bookattach中。和bookname =" A12"。
xslt正如预期的那样工作但问题是当它复制元素bookattach时属性bookname =' AA12'在那里添加名称空间条目。例如,它将条目复制为:
<bookattach xmlns:mynamespace="http://myorg.com/mymodel/Library" bookname="AA12">
<book bookname="bacbook1" description="This is test book1"/>
</bookattach>
我不想在转换的xml中复制此命名空间条目,(我的源xml也不包含bookattach标记中的命名空间条目), 那么如何摆脱这个特定标签中的这个命名空间条目呢?
我的xslt如下:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mynamespace="http://myorg.com/mymodel/Library"
version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:output method="xml"/>
<xsl:key name="bookbyid" match="mynamespace:bookattach" use="@bookname"/>
<xsl:template match="mynamespace:AddBooks">
<xsl:copy>
<xsl:apply-templates select="@*|node() [ not( (self::mynamespace:bookattach and @bookname = 'AA12') )]"/>
<bookattach bookname="AA12">
<xsl:copy-of select="key('bookbyid','AA12')/*"/>
<xsl:for-each select="key('bookbyid','A12')/*">
<xsl:if test="not(./@bookName = key('bookbyid','AA12')/*/@bookName)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</bookattach>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:4)
您需要在exclude-result-prefixes
元素上设置<xsl:stylesheet>
属性,以避免在输出XML中声明名称空间,如下所示:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mynamespace="http://myorg.com/mymodel/Library"
version="1.0"
exclude-result-prefixes="mynamespace">