如何借助参数在XSLT中为“for-each”表达式构建值

时间:2010-03-19 15:03:37

标签: xml xslt

我需要浏览这个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

怎么了?

2 个答案:

答案 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>

请注意使用the XPath name() function