0

这是我的代码:

<xsl:template match="*">
  <Segment ID="{name()}">
    <xsl:value-of select="concat(., ' ')"/>
  </Segment>    
</xsl:template>

<xsl:template match="*" mode="break">
  <Segment ID="{name()}">
    <xsl:value-of select="."/>
  </Segment>
  <Segment>#$NL</Segment>
</xsl:template>

有没有办法在第二个模板中调用第一个模板,这样我就不必重复代码了?像这样的东西:

<xsl:template match="*" mode="break">
  <xsl:apply-templates select="*"/>
  <Segment>#$NL</Segment>
</xsl:template>

我在这里使用 * 并且它不起作用。我尝试了 @* 和 / 但没有任何效果。我的目标是这样称呼它:

<xsl:apply-templates select="FirstName"/> 

或者

<xsl:apply-templates select="Name" mode="break"/>
4

2 回答 2

1

如果您使用xsl:call-template而不是xsl:apply-templates,您可以设置一个命名模板,然后在需要时调用它。

如果我正确理解您的问题,则重复代码是具有指定 ID 属性和内部文本字符串的 Segment 元素。所以你可以给这个模板这两个参数,并在你调用它时指定它们。像这样:

<xsl:template name="segment">
   <xsl:param name="id"/>
   <xsl:param name="text"/>
   <Segment ID="{$id}">
      <xsl:value-of select="$text"/>
   </Segment>    
</xsl:template>

...
   <xsl:call-template name="segment">
      <xsl:with-param name="id" select="name(.)"/>
      <xsl:with-param name="text" select="."/>
   </xsl:call-template>
于 2013-04-10T00:16:23.677 回答
1

您可以简单地用这两个替换您向我们展示的两个模板:

<xsl:template match="*" name="Segment">
  <Segment ID="{name()}">
    <xsl:value-of select="concat(., ' ')"/>
  </Segment>    
</xsl:template>

<xsl:template match="*" mode="break">
  <xsl:call-template name="Segment" />
  <Segment>#$NL</Segment>
</xsl:template>

我可以看到,在您原来的 XSLT 中,第一个模板将空格连接到值上,而第二个模板没有。使用上述方法,在两种情况下都会附加空格。这对您的要求满意吗?

于 2013-04-10T00:25:44.220 回答