XSLT处理分散在各个节点上的文本

XSLT处理分散在各个节点上的文本,xslt,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 <

输入文件如下:

<?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>
我知道如何使用
获取外部
span
中包含的文本,但这也是 包括字符串
“upper”
unchanged,这不是我想要的。我不知道怎么做 操作内部<代码>跨度中的文本,并将其插入中间 另一个文本

失败的尝试:

<?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>

做点什么

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

XSLT1.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>


要了解其工作原理,请阅读内置模板规则:

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

XSLT1.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>


要了解其工作原理,请阅读内置模板规则:

以下方法消除了
,并将问题完全推到匹配表达式上:

<?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>

以下方法消除了
并将问题完全推到匹配表达式上:

<?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>