通过xsl compile覆盖节点检查

时间:2011-08-30 09:40:37

标签: xml xslt

我希望在下面构建以下xsl结构:

<body>
<item></item>
<item></item>
<item></item>
</body>

body节点之间的项目数是可变的,所以我想调用带有param'place'的模板,其中如果值是start或end,则分别创建或关闭body节点。基本代码结构如下。我遇到的问题是,由于在关闭when语句时无法打开节点,因此无法使用此方法。如何覆盖xsl编译器的这种行为

<xsl:choose>
  <xsl:when test="$place='start'">
   <body>
  </xsl:when>
  <xsl:when test="$place='end'">
   </body>
  </xsl:when>
</xsl:choose>

3 个答案:

答案 0 :(得分:1)

  

我想调用带有param'place'的模板,如果值是   分别创建或关闭身体节点的开始或结束

这是不可能的。您不能在XSLT中使用错误的嵌套标记(就像您不能在任何其他编程语言中使用错误的嵌套大括号/括号/控制结构一样)。

幸运的是,这也是完全没必要的。这将做你想要的:

<xsl:template match="body">
  <body>
    <xsl:apply-templates select="item" /> 
  </body>
</xsl:template>

<xsl:template match="item">
  <!-- whatever you want to do with the items -->
</xsl:template>

答案 1 :(得分:0)

你需要这样的东西:

<xsl:param name="tot" select="3"/>

<xsl:template match="body">
  <body>
    <xsl:call-template name="add-items" /> 
  </body>
</xsl:template>

<xsl:template name="add-items">
 <xsl:param name="num" select="1"/>
 <item />
 <xsl:if test="$num &lt; $tot">
  <xsl:call-template name="add-items">
   <xsl:with-param name="num" select="$num + 1"/>
  </xsl:call-template>
 </xsl:if>
</xsl:template>

答案 2 :(得分:0)

XSLT不会“创建”和“关闭”节点作为单独的操作:您不能做一个而不能做另一个。它构建了一个结果树,一个节点或者存在于结果树中,或者不存在。当您需要考虑节点树时,您正在考虑标记。