【问题标题】:XSL: Xpath Query in <xsl:apply-templates> Isn't Returning Any ResultsXSL:<xsl:apply-templates> 中的 Xpath 查询不返回任何结果
【发布时间】:2011-04-17 19:01:49
【问题描述】:

注意 1:这是我在这里的第一个问题。请温柔一点。
注2:是的,这是家庭作业。我讨厌寻求帮助,但我碰壁了。如果您不想告诉我答案,建议在哪里寻找答案将同样受到赞赏。谢谢。

我正在尝试编写一个查看目标 XML 文件中每个 DVD 元素的流派属性的 XSLT 工作表。它应该返回一个列表,其中每个不同的值只列出一次,并计算找到每个值的次数。

我认为我的 XPath 是错误的。为了调试,我尝试使用 &lt;xsl:value-of select="foo"&gt; 语句来尝试不同的 XPath 查询,但我没有任何运气。

这是 XSL 文件(我试图将其剥离到黄铜钉上)

<?xml version="1.0" encoding="UTF-8"?>
<!-- BrowseAllExample.xsl -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">    
    <xsl:key name="genres" match="DVD" use="@genre" />    
    <xsl:template match="/">
        <html>
            <head>
                <title>Browse: DVDs by Genre</title>
                <link href="../style/browseByGenre.css" rel="stylesheet" type="text/css"/>
            </head>
            <body>
                <!-- TODO: insert page header here -->
                <h2>Browse by Genre</h2>
                <div>                    
                    <!-- This doesn't seem to select anything
                    I've tried lots of combinations with a test
                    xsl:value-of-select element, but nothing 
                    seems to work as a selector except "*"                    
                    -->
                    <xsl:apply-templates select="/dvdlist/DVD[not(@genre=preceding-sibling/@genre)]"
                        mode="genreList">
                        <xsl:sort select="@genre"/>
                    </xsl:apply-templates>
                </div>
            </body>
        </html>
    </xsl:template>
    <!-- 
    List each genre and count titles in each
    -->
    <xsl:template match="DVD" mode="genreList">
        <a href="#{generate-id()}"><xsl:value-of select="@genre"/></a> (<xsl:value-of
            select="count(key('genres',@genre))"/>) - 
    </xsl:template>
</xsl:stylesheet>

这是 XML 文件的相关部分:

<?xml version="1.0" encoding="UTF-8"?>
<!-- dvdlistExample.xml -->
<?xml-stylesheet type="text/xsl" href="BrowseAllExample.xsl"?>
<dvdlist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://example.com/dvdlist ./schema/dvdlist.xsd"
    xmlns="http://example.com/dvdlist">
    <DVD genre="Comedy" itemnum="ID-20">
        <title>American Wedding</title>
        <year>2003</year>
        <price>18.89</price>
        <talent>
            <director>Jesse Dylan</director>
            <actor>Jason Biggs</actor>
            <actor>Sean William Scott</actor>
            <actor/>
        </talent>
        <ratings mpaa="NR" customer="3"/>
        <pics id="ID-20">
            <thumbnail>Wedding-small.jpg</thumbnail>
            <large>Wedding-big.jpg</large>
        </pics>
    </DVD>
    <DVD genre="Action" itemnum="ID-2">
        <title>Badboys II</title>
        <year>2003</year>
        <price>20.27</price>
        <talent>
            <director>Michael Bay</director>
            <actor>Will Smith</actor>
            <actor>Martin Lawrence</actor>
        </talent>
        <ratings mpaa="R" customer="3"/>
        <pics id="ID-2">
            <thumbnail>Badboys-small.jpg</thumbnail>
            <large>Badboys-big.jpg</large>
        </pics>
    </DVD>
    <!--Other DVD entries removed to save space-->
</dvdlist>

【问题讨论】:

  • 提示:您的 XML 绑定到命名空间:xmlns="http://example.com/dvdlist"。如果要在 XSLT/XPath 中处理这些元素,则需要声明命名空间并在 XPath 中使用前缀,或者在谓词过滤器中匹配 namespace-uri()
  • 哇,XSLT 用于家庭作业。我不记得我的家庭作业曾经那么有趣! +1 写得很好的问题。
  • +1 希望每个问题都经过深思熟虑!
  • 是的。 这是一个常见问题解答How to 'select' from XML with namespaces with XSLT? 的可能重复项

标签: xml xslt xpath


【解决方案1】:

How to 'select' from XML with namespaces? 应该可以帮助您满足您的需求。

XML 命名空间只是一种实现 XML 元素和属性唯一性的方法。如果两个用户/公司/whatevers 定义了一个&lt;DVD&gt; 元素,那么命名空间就是将它们分开的方式。因此,例如,您可以处理两个不同的 &lt;DVD&gt; 元素,方法是选择每个元素以及定义它的适当命名空间。

【讨论】:

  • 这加上上面 Mads Hansen 的评论将我引向了正确的方向。我没有意识到我有命名空间问题。我从来没有想过 XSLT 中的 XPath 由于命名空间而无法解析目标 XML 中的元素,尽管现在看起来很明显。谢谢大家!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
相关资源
最近更新 更多