4

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

4

4 回答 4

13

模板中表示的所有相对路径都针对当前节点进行评估。您的模板匹配 Gender 元素,因此如果有任何Gender 的名为“Gender”且值为“M”的子代,则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>
于 2009-11-23T09:17:32.063 回答
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>
于 2009-11-23T09:02:40.983 回答
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()条形空白。

于 2009-11-23T09:15:21.983 回答
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>

根据另一个答案使用选择会更好(尽管我认为应该是两个明确的 when 子句而不是 when 和 else)

于 2009-11-23T09:16:43.507 回答