我仍然是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>
答案 0 :(得分:2)
当XML元素为空时<element></element>
,您可以将其视为<element/>
。因此元素中没有text()
个节点。所以你的模板与空/ null元素不匹配。
使模板与元素匹配。然后在里面用test not(text())
选择text()内容的存在。我还将条件与and
和or
放在一起。
<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>