使用XSLT读取标记或元素的多个实例

时间:2010-04-08 08:00:00

标签: xslt rdf html-select

我的RDF xml文件是这样的..

<rdf:RDF>
    <rdf:Description rdf:about="........">
        <j.0:property rdf:resource="....."/>
        <j.0:property rdf:resource=....."/>
        <j.0:property rdf:resource="........"/>
    </rdf:Description>
</rdf:RDF>

现在在我的XSLT样式表中,我需要检索所有j.0:property标记的值。我正在使用这样的东西:

<xsl:apply-templates select="j.0:property"/>

<xsl:template match="j.0:property">
      <xsl:text><xsl:value-of select="/rdf:RDF/rdf:Description/j.0:propert  /@rdf:resource"/></xsl:text>    
</xsl:template>

然后它返回相同的值3次。该值是遇到的第一个属性的值。 请帮助我如何获得每个房产的价值。

3 个答案:

答案 0 :(得分:4)

在模板匹配中,您处于匹配元素的上下文中。因此,如果您尝试获取属性的值,您所要做的就是:

<xsl:value-of select="@rdf:resource"/>

您当前在select属性中使用的路径以“/”开头,因此是从文档的根开始而不是相对于您所在位置的路径。无论在何处使用,它都将始终返回相同的值。

答案 1 :(得分:1)

您不确定您显示的XSLT是否真的是您正在使用的XSLT。你发布它的方式,它无法编译。 xsl:apply-templates行与xsl:template行位于同一级别吗? xsl:text真的包含xsl:value-of吗?如果是这样,我会非常有兴趣了解您使用的处理器,因为没有处理器应该处理您的XSLT而不通知您错误。

也就是说,要改进样式表,请在答案中按Russel Leggett explains进行操作。而不是选择模板中的所有节点(从/开始,从根目录中选择),而不是从当前节点中选择。得到他的答案并删除xsl:text错误,你得到了这个:

<xsl:template match="j.0:property">
    <xsl:value-of select="@rdf:resource"/>
</xsl:template>

使用XSLT 1.0,如果选择多个节点xsl:value-of,它将仅输出第一个节点。因为你似乎确实有一个显然正在工作的xsl:apply-templates,所以选择所有但只返回第一个(代码中以/开头的那个)的那一行将被调用三次在xsl:apply-templates

中选择的每个节点

为了帮助您进一步,更好,请展示我们可以针对您的示例数据运行的完整XSLT样式表的最小示例。

答案 2 :(得分:0)

这一行错了:

<xsl:text><xsl:value-of select="/rdf:RDF/rdf:Description/j.0:propert  /@rdf:resource"/></xsl:text>

当您到达模板时,您处于所选项目中,因此您只需要:

<xsl:value-of select="@rdf:resource" />