我有这个XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<Books>
<book bookID="b100">
<categories>
<category>Programming</category>
<category>Learning</category>
<category>Database</category>
</categories>
</book>
</Books>
我想将xml文档转换为这个文档:
<Books>
<book>
<bookID>b100</bookID>
<categories>
<category>Programming</category>
<category>Learning</category>
<category>Database</category>
</categories>
</book>
</Books>
我有更多书,但我只发布了这本书。我在这里为xml做了这个xslt代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="Books">
<Books>
<xsl:apply-templates />
</Books>
</xsl:template>
<xsl:template match="book">
<book>
<xsl:element name="bookID"><xsl:value-of select="@bookID"/></xsl:element>
<categories>
<xsl:for-each select="categories/category">
<xsl:element name="category">
<xsl:value-of select="category"/>
</xsl:element>
</xsl:for-each>
</categories>
</book>
</xsl:template>
</xsl:stylesheet>
问题是类别没有显示,我只是得到他们的标记:
<Books>
<book>
<bookID>b100</bookID>
<categories>
<category />
<category />
<category />
</categories>
</book>
<book>
<bookID>b101</bookID>
<categories>
<category />
<category />
<category />
<category />
</categories>
</book>
</Books>
知道我在xslt代码中做错了什么?!
答案 0 :(得分:0)
使用xsl:copy-of
复制类别。
<xsl:template match="book">
<book>
<xsl:element name="bookID"><xsl:value-of select="@bookID"/></xsl:element>
<xsl:copy-of select="categories"/>
</book>
</xsl:template>
答案 1 :(得分:0)
您要实现的唯一真正的变化是将属性bookID
转换为元素bookID
,因此我会设置一个模板,例如
<xsl:template match="@bookID">
<bookID>{.}</bookID>
</xsl:template>
在XSLT 3(http://xsltfiddle.liberty-development.net/gWcDMem)或
中 <xsl:template match="@bookID">
<bookID>
<xsl:value-of select="."/>
</bookID>
</xsl:template>
在XSLT 1(http://xsltfiddle.liberty-development.net/gWcDMem/1)或2中,然后其余部分可以通过身份转换来处理。
通过这种方式,您可以采用模块化和结构化方法,允许为任何需要更改的元素或属性添加更多模板。