我对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>
< /目录>
 代码>


答案 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>