这是我的xml文件
<html xmlns="http://www.w3schools.com">
<body>
<shelf>
<cd id="el01">
<artist>Elton John</artist>
<title>Circle of Life</title>
<country>UK</country>
<company>Spectrum</company>
<price>10.90</price>
<year>1999</year>
<description>As heard in the Lion King.</description>
</cd>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.
</description>
</book>
</shelf>
</body>
</html>
这是我的XSL文件
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<!-- TODO customize transformation rules
syntax recommendation http://www.w3.org/TR/xslt
-->
<xsl:template match="/">
<html>
<head>
<title>The Shelf</title>
</head>
<body>
<h1>The Shelf</h1>
<xsl:apply-templates select="shelf"/>
</body>
</html>
</xsl:template>
<xsl:template match="//shelf">
<xsl:for-each select="cd|book">
<xsl:value-of select="title"/>
</xsl:for-each>
</xsl:template>
我的输出只是浏览器中的“The Shelf”。我哪里错了?
答案 0 :(得分:6)
你有两个问题。
您的数据有一个名称空间“http://www.w3schools.com”,但您不能在xslt中声明并使用它 - 由于您需要的xml / xpath规范不匹配也改变你的选择器。我已经声明了一个'data'前缀来匹配你的xml文档的默认名称空间,然后改变你所有的xpath选择来匹配。不幸的是,您不能只是一个默认命名空间,因为默认名称空间在xpath中不起作用。 (或者,您可以从xml文档中删除默认命名空间,但这可能并不总是一个选项。)
您的货架选择器找不到与“/”相关的任何匹配节点。我已将您的初始应用模板更改为// data:shelf以匹配所有数据:可在文档中的任何位置找到的shelf节点。
尝试以下
<xsl:stylesheet xmlns:data="http://www.w3schools.com" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<!-- TODO customize transformation rules
syntax recommendation http://www.w3.org/TR/xslt
-->
<xsl:template match="/">
<html>
<head>
<title>The Shelf</title>
</head>
<body>
<h1>The Shelf</h1>
<xsl:apply-templates select="//data:shelf"/>
</body>
</html>
</xsl:template>
<xsl:template match="//data:shelf">
<xsl:for-each select="data:cd|data:book">
<p><xsl:value-of select="data:title"/></p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
你的select =“shelf”错了。如果你只是删除它应该工作。或者尝试选择=“html / body / shelf”。
答案 2 :(得分:0)
您的行<xsl:apply-templates select="shelf"/>
将应用于根节点(即html / shelf)的上下文中。此级别没有货架节点。
将该行转换为<xsl:apply-templates select="body/shelf"/>
就足够了。