XSLT将XML转换为另一个XML文档

时间:2018-01-27 14:27:03

标签: xml xslt transform

我有这个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代码中做错了什么?!

2 个答案:

答案 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中,然后其余部分可以通过身份转换来处理。

通过这种方式,您可以采用模块化和结构化方法,允许为任何需要更改的元素或属性添加更多模板。