XSL - 需要做一些事情的时候文本()仅仅是“纯文本”(XSL — Need to do som

2019-10-16 13:40发布

想做一个节点的文本内容,一些分析/修改,如果所有的text()返回的是一个纯文本字符串。 没有XML里面。

例如

<test>some <super>1</super> text here</test>

text()<test>只是返回“一些”。 这是我希望输出的文本,而是想调用应用模板的情况下。

反正有没有告诉或者是这种情况太暧昧XSL来处理?

编辑:我想输出是正是这一点

推理是这样的:有时候,仅仅是一个拥有由“/”分割字文本。 我想之前加空格和后所以它的“/”代替。 但有时在同一个节点具有XML在里面。

some <super>1</super> text here

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


Answer 2:

实际上,在所描述的情况,文本()返回两个文本节点的序列,“一些”和“文字在这里”,但是在XSLT 1.0,在节点序列(或一组)的许多操作忽略除第一个所有节点。

你还没说你想要的输出。 但处理混合内容的常用方法是调用应用模板来处理所有的孩子们。 明确使用文本的()是很少做正确的事。



Answer 3:

测试或谓词count(text()) = count(node())应该努力使区别。



Answer 4:

这个样式表:

<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()的模式。



文章来源: XSL — Need to do something when text() is just 'plain text'
标签: xml xslt text