XSLT:如何处理测试元素的值?

时间:2009-11-23 08:53:47

标签: xslt xslt-1.0

我有一个xml文件,其中有标签,&lt; Gender /&gt;它带有'M'或'F'作为数据,现在我的工作是测试值并分别根据值M或F写<Gender_Tag>Male</Gender_Tag><Gender_Tag>Female</Gender_Tag> ..我试过这段代码..它曾经在其他情况下工作..

4 个答案:

答案 0 :(得分:12)

模板中表示的所有相对路径都是针对当前节点进行评估的。您的模板与性别元素匹配,因此 Gender ='M'如果有任何名为'Gender'的 Gender的子项值为'M',则返回true。我想情况并非如此......

使用点表示当前节点(此处为Gender元素):

<xsl:template match="root/details/Gender">
  <Gender_Tag>  
    <xsl:choose>
      <xsl:when test=".='M'">
        <xsl:text>Male</xsl:text>
      </xsl:when>
      <xsl:otherwise>
       <xsl:text>Female</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </Gender_Tag>
</xsl:template>

编辑:您也可以使用两个模板

<xsl:template match="root/details/Gender[.='M']">
  <Gender_Tag>Male</Gender_Tag>
</xsl:template>
<xsl:template match="root/details/Gender[.='F']">
  <Gender_Tag>Female</Gender_Tag>
</xsl:template>

答案 1 :(得分:5)

未经测试,但可能有效...

<xsl:template match="root/details/Gender">
  <xsl:if test="text()='M'">
    <Gender_Tag>Male</Gender_Tag>
  </xsl:if>
  <xsl:if test="text()='F'">
    <Gender_Tag>Female</Gender_Tag>
  </xsl:if>
</xsl:template>

答案 2 :(得分:5)

<xsl:template match="root/details/Gender">
    <xsl:choose>
        <xsl:when test="normalize-space(text())='M'">
            <Gender_Tag>Male</Gender_Tag>
        </xsl:when>
        <xsl:otherwise>
            <Gender_Tag>Female</Gender_Tag>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

我的例子与Scoregraphic的两点不同:

  1. 它使用xsl:choose来确保只创建一个Gender_Tag元素(这也意味着,如果文本不是'M',它总是一个女性)

  2. 使用normalize-space()剥离元素文本内容周围的空白区域。

答案 3 :(得分:2)

没有看到XML很难确定,但我认为您的示例XSLT应该是:

<xsl:template match="root/details/Gender">    
   <xsl:if test=".='M'">
      <Gender_Tag><xsl:text>Male</xsl:text></Gender_Tag>
   </xsl:if>
   <xsl:if test=".='F'">
      <Gender_Tag><xsl:text>Female</xsl:text></Gender_Tag>
   </xsl:if>
</xsl:template>

根据另一个答案选择使用会更好(虽然我认为当条款而不是时间和其他时候应该是两个明确的)