使用XSLT和XPath,获取XML节点或元素的值?

时间:2012-09-09 21:09:32

标签: xml xslt xpath

我知道这是超级菜鸟,但我只是不明白为什么我的代码不起作用。这是XML片段:

<root>
  <cookies>
    <lastviewedentityname>Category</lastviewedentityname>
    <lastviewedentityinstanceid>72</lastviewedentityinstanceid>
    <lastviewedentityinstancename>Fall Florals</lastviewedentityinstancename>
    some random text bla bla
  </cookies>
  <QueryString>
    <categoryid>34</categoryid>
  </QueryString>
  <!-- other nodes -->
</root>

以下是XSL片段:

<?xml version="1.0" standalone="yes" ?>
<package version="2.1" displayname="Categories" debug="false" includeentityhelper="true">
  <PackageTransform>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ise="urn:ise" exclude-result-prefixes="ise">
        <xsl:output method="html" omit-xml-declaration="yes"/>

            <!-- other code -->

            <xsl:value-of select="/root/cookies/lastviewedentityinstanceid"/>

            <!-- other code -->

    </xsl:stylesheet>
  </PackageTransform>
</package>

我正在寻找的结果是

  

72

但似乎我得到空字符串或其他东西。看看这个:http://www.w3schools.com/xsl/xsl_value_of.asp,我假设我的代码没问题。此外,确认这一点,就是这段代码:

<xsl:value-of select="/root/QueryString/categoryid"/>

给我正确的价值

  

34

然后在我试图找到答案时,我找到了这个网站:http://www.mizar.dk/XPath/Default.aspx我注意到在这里尝试时,它会突出显示元素,而不是其中的值:http://screencast.com/t/NXuNiCHbEd0T

以下是一些更多信息: 我正在研究的系统名为Interprise Suite Ecommerce(这就是“ise”来自的地方)。这是他们的网络软件,与他们的ERP软件Interprise Suite集成。 ISE是一个电子商务软件,不久前改编自AspDotNetStoreFront。我会尝试解释我所掌握的有限知识。

正在加载的页面是产品或类别页面。我正在处理的这个特定文件提供了侧栏产品导航菜单的布局。该文件名为rev.categories.xml.config。这个文件包含XSLT代码。它正在转换的原始XML数据,我不知道它来自哪里,我无法访问它。有了Dimitre在上一个问题中的帮助,我能够在网页中重现XML数据,这样我就可以理解更多了。在其输出中,顶级节点是

<root>

加载此XML包的文件名为template.ascx。它是模板或“主”文件。在ASPDNSF中,您可以使用这些称为“令牌”的东西将内容加载到页面中,此令牌就是调用rev.categories.xml.config来激活和执行其操作。令牌如下所示:

(!XmlPackage Name="rev.categories"!)

我不确定令牌是如何工作的。我的想法是它不相关,因为除了这一行代码之外,这个文件中的其他所有东西都在工作。

请原谅我缺乏知识,经验和适当的语言。

编辑:这是指向rev.categories.xml.confg完整代码的链接。 http://jsfiddle.net/v5cNM/

1 个答案:

答案 0 :(得分:1)

很少(如果有的话)(我不知道)XSLT处理器支持嵌入式样式表

在XML文档上应用转换的正确且普遍支持的方法是将XSLT样式表放在单独的XML文档中(通常驻留在自己的文件中)。

<xsl:stylesheet>(或其同义词xsl:transform)必须是样式表的顶部元素。

此转换(占用自己的文件):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:value-of select=
  "/root/cookies/lastviewedentityinstanceid"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<root>
  <cookies>
    <lastviewedentityname>Category</lastviewedentityname>
    <lastviewedentityinstanceid>72</lastviewedentityinstanceid>
    <lastviewedentityinstancename>Fall Florals</lastviewedentityinstancename>
    some random text bla bla
  </cookies>
  <!-- other nodes -->
</root>

生成想要的正确结果

72