子元素替换为新元素名称

时间:2015-06-03 19:13:21

标签: xslt

我对XSLT世界很陌生。任何人都可以帮我解决问题吗?
我有一个输入XML和所需的输出XML。需要为此转换编写XSLT。
条件:
如果任何元素以“11”结尾,那么子元素节点“title”(如果存在)则标题将替换为CDtitle
即,
 cd11 / title将是cd11 / CDtitle




 输入XML
 ---------------
 < catalog>
< cd11>
< title> Empire Burlesque< / title>
< artist> Bob Dylan< / artist>
< year> 1985< / year>
< / cd11>
< cd22>
< title> Empire Burlesque< / title>
< artist> Bob Dylan< / artist>&# xA;< year> 1985< / year>
< / cd22>
< cd33>
< title> Empire Burlesque< / title>
< artist> Bob Dylan< / artist>
< year> 1985< / year>
< / cd33>
< / catalog>


输出XML
 ---------------
< catalog>
< cd11>
< CDtitle> Empire Burlesque< / CDtitle>& #xA;< artist> Bob Dylan< / artist>
< year> 1985< / year>
< / cd11>
< cd22>
< title&gt ; Empire Burlesque< / title>
< artist> Bob Dylan< / artist>
< year> 1985< / year>
< / cd22>
 < cd33>
< title> Empire Burlesque< / title>`在这里输入代码`
< artist> Bob Dylan< / artist>
< year> 1985< / year> 
< / CD33>
< /目录>
  



2 个答案:

答案 0 :(得分:1)

当您希望输出与输入类似并进行一些更改时,您可以从身份转换开始,然后将所需的自定义添加到其中。

所以从这开始复制一切:

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

然后在更具体的匹配中添加您想要的唯一内容。在您的情况下,您可以将其声明为&#34;其父项以&#39; 11&#39;&#34;结尾的任何标题。你可以这样写:

 <xsl:template match="title[substring(name(parent::*),string-length(name(parent::*)) - 1, 2) = '11']">

把它放在一起:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
        <xsl:template match="title[substring(name(parent::*),string-length(name(parent::*)) - 1, 2) = '11']">
            <CDTitle>
                 <xsl:apply-templates />
            </CDTitle>
        </xsl:template>
        <xsl:template match="@* | node()">
            <xsl:copy>
                <xsl:apply-templates select="@* | node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>

输出是:

<catalog>
<cd11>
    <CDTitle>Empire Burlesque</CDTitle>
    <artist>Bob Dylan</artist>
    <year>1985</year>
</cd11>
<cd22>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <year>1985</year>
</cd22>
<cd33>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <year>1985</year>
</cd33>
</catalog

答案 1 :(得分:0)

下面简单的XSL将按预期生成你的OUPUT。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
  <xsl:copy>
<xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

 <xsl:template match="cd11">
<xsl:copy>
    <CDTitle>
    <xsl:value-of select ="title"/>
    </CDTitle>
        <xsl:copy-of select = "artist"/>
    <xsl:copy-of select = "year"/>
    </xsl:copy>      


</xsl:template>
 </xsl:stylesheet>