我需要浏览这个xml树。
<publication>
<corporate>
<contentItem>
<metadata>meta</metadata>
<content>html</content>
</contentItem>
<contentItem >
<metadata>meta1</metadata>
<content>html1</content>
</contentItem>
</corporate>
<eurasia-and-africa>
...
</eurasia-and-africa>
<europe>
...
</europe>
</publication>
并使用此样式表将其转换为html
<ul>
<xsl:variable name="itemsNode" select="concat('publicationManifest/',$group,'/contentItem')"></xsl:variable>
<xsl:for-each select="$itemsNode">
<li>
<xsl:value-of select="content"/>
</li>
</xsl:for-each>
</ul>
$ group是一个名称为group的参数,例如“corporate”。编译此样式表时出错。 SystemID:D:\ 1 \ contentsTransform.xslt
Engine name: Saxon6.5.5
Severity: error
Description: The value is not a node-set
Start location: 18:0
怎么了?
答案 0 :(得分:2)
您无法构建和评估动态XPath表达式。 99.9%的时间,你不需要。推论:如果您觉得需要动态评估XPath,那么您很可能做错了。
声明您的$pGroup
参数:
<xsl:param name="pGroup" select="''" />
...为您的文档元素(<publication>
)制作模板:
<xsl:template match="publication">
<body>
<!-- select only elements with the right name here -->
<xsl:apply-templates select="*[name() = $pGroup]" />
</body>
</xsl:template>
...以及包含 <contentItem>
元素的任意元素:
<xsl:template match="*[contentItem]">
<ul>
<xsl:apply-templates select="contentItem" />
</ul>
</xsl:template>
...以及<contentItem>
元素本身的一个:
<xsl:template match="contentItem">
<li>
<xsl:value-of select="content" />
</ul>
</xsl:template>
完成。
答案 1 :(得分:2)
在XSLT中,可以通过以下方式轻松实现:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="pGroup" select="'corporate'"/>
<xsl:template match="/">
<ol>
<xsl:for-each select="/*/*[name()=$pGroup]/contentItem">
<li>
<xsl:value-of select="content"/>
</li>
</xsl:for-each>
</ol>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换后,生成所需结果:
<ol>
<li>html</li>
<li>html1</li>
</ol>