XSL - 当text()只是'纯文本'时需要做一些事情

时间:2011-05-02 20:56:22

标签: xml xslt text

如果text()返回的所有内容都是纯文本字符串,则希望对节点的文本内容进行一些解析/修改。里面没有XML。

例如

<test>some <super>1</super> text here</test>
text()的{​​{1}}只返回“some”。这是我想要输出文本而是想调用apply-templates的情况。

无论如何要告诉或者这种情况对于XSL来说是否过于模糊?

编辑: 我想要的输出就是这个

推理是这样的:有时只有一个单词被“/”分隔的文字。我想在之前和之后添加空格,所以它是“/”而不是。但有时同一节点中有xML。

<test>

4 个答案:

答案 0 :(得分:2)

实际上在描述的情况下,text()返回两个文本节点的序列,“some”和“text here”,但在XSLT 1.0中,对序列(或集合)节点的许多操作忽略除了第一

您还没有说出您想要的输出。但处理混合内容的常用方法是调用apply-templates来处理所有子节点。显式使用text()很少是正确的事情。

答案 1 :(得分:1)

测试或谓词count(text()) = count(node())应该有效区分。

答案 2 :(得分:1)

您可以测试当前节点是否有子节点:

<xsl:template match="/test">
  <xsl:choose>
    <xsl:when test="./*">
      <xsl:text>children: </xsl:text>
      <xsl:apply-templates />
    </xsl:when>
    <xsl:otherwise>
        <xsl:text>just text: </xsl:text>
        <xsl:value-of select="./text()" />
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

答案 3 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="vLetters"
    >qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM</xsl:variable>
    <xsl:variable name="vDots"
    >....................................................</xsl:variable>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="test/text()" name="tokenize">
        <xsl:param name="pString" select="string()"/>
        <xsl:variable name="vString"
         select="translate($pString,$vLetters,$vDots)"/>
        <xsl:choose>
            <xsl:when test="contains($vString,'./.')">
                <xsl:variable name="vOffset"
                 select="string-length(substring-before($vString,'./.'))"/>
                <xsl:value-of select="substring($pString,1,$vOffset+1)"/>
                <xsl:text> / </xsl:text>
                <xsl:call-template name="tokenize">
                    <xsl:with-param name="pString"
                     select="substring($pString,$vOffset+3)"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$pString"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<test>This is an answer/solution to <user>OP/bobber205</user>'s question/problem</test>

输出:

<test>This is an answer / solution to <user>OP/bobber205</user>'s question / problem</test>

注意:分割后代的一种方式(另一种方式是模式)是使用test//text()作为模式。