我想使用XMLT动态生成XML文件,该文件将另一个XML文件作为输入。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="data">
<xsl:apply-templates select="books" />
</xsl:template>
<xsl:template match="books">
<books>
<xsl:apply-templates select="chapters" />
</books>
</xsl:template>
<xsl:template match="chapters">
<chapter name="{@name}" source="{@source}"
xmlns:xi="http://www.w3c.org/2001/XInclude">
<xsl:apply-templates select="pages" />
</chapter>
</xsl:template>
<xsl:template match="pages" xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include>
<xsl:value-of select="@name" />
</xi:include>
</xsl:template>
</xsl:stylesheet>
我想要的输出如下。
<chapter
xmlns:xi="http://www.w3c.org/2001/XInclude" name="chapter1">
<xi:include>page1</xi:include>
<xi:include>page2</xi:include>
<xi:include>page3</xi:include>
</chapter>
不幸的是,我的代码会在下面生成输出。
<chapter
xmlns:xi="http://www.w3c.org/2001/XInclude" name="chapter1">
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude">page1</xi:include>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude">page2</xi:include>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude">page3</xi:include>
</chapter>
有没有办法可以消除名称空间的实际URI,因为我可以使用xi:include tages而不使用它们?
答案 0 :(得分:2)
将xmlns:xi="http://www.w3.org/2001/XInclude"
移至xsl:stylesheet
元素:
<xsl:stylesheet version="1.0"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="data">
<xsl:apply-templates select="books" />
</xsl:template>
<xsl:template match="books">
<books>
<xsl:apply-templates select="chapters" />
</books>
</xsl:template>
<xsl:template match="chapters">
<chapter name="{@name}" source="{@source}">
<xsl:apply-templates select="pages" />
</chapter>
</xsl:template>
<xsl:template match="pages">
<xi:include>
<xsl:value-of select="@name" />
</xi:include>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
请注意您使用两个不同的命名空间URI :
http://www.w3.org/2001/XInclude
和
http://www.w3c.org/2001/XInclude
如果它们相同,那么namespace fixup process就可以解决这个问题。
对于此输入:
<books>
<chapters name="chapter1">
<pages name="page1"/>
<pages name="page2"/>
<pages name="page3"/>
</chapters>
</books>
这个样式表(你的修改过的拼写错误):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="data">
<xsl:apply-templates select="books" />
</xsl:template>
<xsl:template match="books">
<books>
<xsl:apply-templates select="chapters" />
</books>
</xsl:template>
<xsl:template match="chapters">
<chapter name="{@name}" source="{@source}"
xmlns:xi="http://www.w3c.org/2001/XInclude">
<xsl:apply-templates select="pages" />
</chapter>
</xsl:template>
<xsl:template match="pages" xmlns:xi="http://www.w3c.org/2001/XInclude">
<xi:include>
<xsl:value-of select="@name" />
</xi:include>
</xsl:template>
</xsl:stylesheet>
输出:
<books>
<chapter name="chapter1" source=""
xmlns:xi="http://www.w3c.org/2001/XInclude">
<xi:include>page1</xi:include>
<xi:include>page2</xi:include>
<xi:include>page3</xi:include>
</chapter>
</books>