我的XML是'input.xsl'
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="input.xsl"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
</catalog>
现在我想在XSLT的帮助下使用上面的XML文件生成另一个XML文档,如下所示,(OUTPUT格式)
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
</cd>
</catalog>
为此我创建了xsl文件'input.xsl'
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:element name="catalog">
<xsl:apply-templates select="catalog/cd/title"/> <br/>
<xsl:apply-templates select="catalog/cd/artist"/>
</xsl:element>
</xsl:template>
<xsl:template match="catalog/cd/artist">
<xsl:element name="cd">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:template>
<xsl:template match="catalog/cd/title">
<xsl:element name="cd">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
上述xsl文件不会以xml格式生成输出。那我的代码有什么问题呢。引导我。提前谢谢。
答案 0 :(得分:1)
您正在使用调用的select子句中要匹配的路径。请记住,当每个节点匹配时,它将成为当前节点,从该节点评估任何后续相对XPath表达式。此外,您不需要一直构建元素 - 只需将'样板'XML放在您想要的位置即可。
我建议改为:
<xsl:template match="/">
<catalog><xsl:apply-templates /></catalog>
</xsl:template>
<xsl:template match="cd">
<cd><xsl:apply-templates /></cd>
</xsl:template>
<xsl:template match="artist">
<artist><xsl:value-of select="text()" /></artist>
</xsl:template>
<xsl:template match="title">
<title><xsl:value-of select="text()" /></title>
</xsl:template>
我不记得text()是否正确,但这可能会让你朝着正确的方向前进。
答案 1 :(得分:1)
实际上,我认为您不需要所有模板匹配。这似乎使其变得更加困难,因为每次都有不同的背景。
我只是匹配根,并在cd元素上执行for-each。 看起来这么简单,我想你只会从阅读中理解; - )
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<xsl:template match="/">
<catalog>
<xsl:for-each select="catalog/cd">
<cd>
<title><xsl:value-of select="title"/></title>
<artist><xsl:value-of select="artist"/></artist>
</cd>
</xsl:for-each>
</catalog>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
另一种方法,利用身份转换模式。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="country | company | price | year | processing-instruction()"/>
</xsl:stylesheet>
应用于示例XML,产生了正确的结果:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
</cd>
</catalog>