XSLT-创建父XML元素

时间:2015-08-07 08:48:50

标签: xslt

我在最近开始学习XSLT之后开始学习XML和XPath;我试图完成练习;我想我差不多了,但我遇到了问题。所以我有以下XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>
    <b></b>
    <b></b>
    <b></b>
    <b></b>
</a>
</root>

我想用一对父元素包围元素(输出以下内容):

<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>
  <b-group>
    <b></b>
    <b></b>
    <b></b>
    <b></b>
  <b-group>
</a>

这是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:template match="root">
    <xsl:element name="root">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="a">
    <xsl:element name="a">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="b">
    <xsl:element name="b-group">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="b">
    <xsl:element name="b">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

尽管做了其他几次尝试,我仍然难以创建围绕元素的元素对;有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

您需要在匹配a的模板中执行此操作,例如:

<xsl:template match="a">
    <a>
        <b-group>
            <xsl:apply-templates select="b"/>
        </b-group>
    </a>
</xsl:template>

附加说明

使用文字结果元素创建名称已知的元素,而不是xsl:element

您的大多数模板都做同样的事情:创建一个与匹配的元素同名的元素,并将模板应用于其子元素。因此,它们可以合并为一个。像这样的模板被称为identity transform template,它通常在大多数文档需要保留的情况下使用,只需要进行一些修改。这会将整个样式表简化为:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="a">
    <a>
        <b-group>
            <xsl:apply-templates select="b"/>
        </b-group>
    </a>
</xsl:template>

</xsl:stylesheet>