XSLT操纵分散在各个节点上的文本

时间:2014-10-30 21:06:39

标签: xslt

输入文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- lower UPPER case -->
<document>
  <rubbish> rubbish </rubbish>
  <span class='lower'>
    lower
    <span class='upper'> upper </span>
    case
  </span>
</document>

通缉输出:

lower UPPER case

我知道如何使用span将文本包含在外部value-of中,但这也是如此 包括字符串"upper"不变,这不是我想要的。我不知道怎么 操纵内部span中的文本并将其插入到中间 另一个文字。

尝试失败:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">
  <xsl:output method="text" indent="no"/>
  <xsl:template match="/">
    <xsl:for-each select="//span[@class = 'lower']">
      <xsl:if test="span/@class = 'upper'">
        <xsl:text>do something</xsl:text> <!--TO DO -->
      </xsl:if>
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:2)

您需要在此处采用递归方法,例如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="text()[parent::span]">
    <xsl:choose>
        <xsl:when test="../@class='upper'">
            <xsl:value-of select="translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="." />
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

要了解其工作原理,请阅读内置模板规则:http://www.w3.org/TR/xslt/#built-in-rule

答案 1 :(得分:2)

以下方法取消了<choose>,并将问题完全推送到匹配表达式:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

  <xsl:template match="text()"/>

  <xsl:template match="text()[parent::span[@class = 'upper']]">
    <xsl:value-of select="translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
  </xsl:template>

  <xsl:template match="text()[parent::span[@class = 'lower']]">
    <xsl:value-of select="translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/>
  </xsl:template>

</xsl:stylesheet>