2014-10-30 44 views
1

输入文件如下: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 

我知道如何让包括在外spanvalue-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

这里需要采取一种递归方法,例如:

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

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>