在元素名称的情况下,XSLT获取变量

时间:2013-06-23 14:52:47

标签: xslt xslt-1.0

我可以使用三个节点之一获取xml。

<root>
  <headerA>
    <!-- Content -->
  </headerA>
</root>

代替<headerA>,可以有<headerB><headerС>个节点,内容相似。在这种情况下,我希望将html输出为:

<span> Type [X] </span> 

其中[X]是A,B或C,具体取决于元素的标记名称。

2 个答案:

答案 0 :(得分:1)

正如Tomalak已经观察到的那样,你的问题相当含糊。听起来好像你可能会问如何为这三种标题写一个模板:

<xsl:template match="headerA | headerB | headerC">
  <span>
    <xsl:apply-templates/>
  </span>
</xsl:template>

或者如何为它们编写类似但不同的模板:

<xsl:template match="headerA">
    <span> Type A </span>
</xsl:template>
<xsl:template match="headerB">
    <span> Type B </span>
</xsl:template>
<!--* Template for headerC left as an exercise for the reader *-->

或者如何根据匹配的内容编写一个稍微不同的模板:

<xsl:template match="headerA | headerB | headerC">
  <span>
    <xsl:choose>
      <xsl:when test="self::headerA">
         <xsl:text> Type A </xsl:type>
      </xsl:when>
      <xsl:when test="self::headerB">
         <xsl:text> Type B </xsl:type>
      </xsl:when>
      <!--* etc. *-->
      <xsl:otherwise>
        <xsl:message terminate="yes"
          >I thought this could not happen.</xsl:message>
      </xsl:otherwise>
    </xsl:choose>
    <xsl:apply-templates/>
  </span>
</xsl:template>

如果您弄清楚哪些对您有帮助,您将更接近了解您要问的问题。

答案 1 :(得分:0)

<xsl:template match="*[starts-with(name(), 'header')]">
  <xsl:variable name="type" select="substring-after(name(), 'header')" />
  <span>
    <xsl:value-of select="concat(' Type ', $type, ' ')" />
  </span>
</xsl:template>

这适用于任何名为headerX的元素,其中X可以是任何字符串。