用于匹配空文本的XSL模板

时间:2014-07-22 14:25:47

标签: xml xslt

我仍然是xsl中的新手,我基本上都有包含一组这样的标签的XML文件

<Property name="errors"><Property> 

并需要将其更改为

<Property name="errors">empty<Property>

所以我为text()创建了一个模板,如果这个属性的文本为空则检查内部''然后我把它改成'空'

实际上,如果我想将任何字符串更改为其他字符串,例如'none',则为'empty'但不适用于null或空字符串

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Property/text()">
  <xsl:choose>
  <xsl:when test=". = 'none'">
    <xsl:choose>
      <xsl:when test="../@name = 'errors'">
        <xsl:value-of select="'empty'"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="." />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:when>
  <xsl:when test=". = ''">
      <xsl:choose>
        <xsl:when test="../@name = 'errors'">
          <xsl:value-of select="'empty'"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="." />
        </xsl:otherwise>
      </xsl:choose>
   </xsl:when>
   <xsl:otherwise>
     <xsl:value-of select="." />
   </xsl:otherwise>
 </xsl:choose>
</xsl:template>

2 个答案:

答案 0 :(得分:2)

当XML元素为空时<element></element>,您可以将其视为<element/>。因此元素中没有text()个节点。所以你的模板与空/ null元素不匹配。

使模板与元素匹配。然后在里面用test not(text())选择text()内容的存在。我还将条件与andor放在一起。

<xsl:template match="Property">
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="@name = 'errors' and (not(text()) or text()='none')">
                <xsl:value-of select="'empty'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="text()"/>
            </xsl:otherwise>
        </xsl:choose>       
    </xsl:copy>
</xsl:template>

答案 1 :(得分:2)

匹配空元素,而不是(不存在的)文本节点:

<xsl:template match="Property[. = '']">
  <Property>empty</Property>
</xsl:template>