想做一个节点的文本内容,一些分析/修改,如果所有的text()
返回的是一个纯文本字符串。 没有XML里面。
例如
<test>some <super>1</super> text here</test>
text()
为<test>
只是返回“一些”。 这是我不希望输出的文本,而是想调用应用模板的情况下。
反正有没有告诉或者是这种情况太暧昧XSL来处理?
编辑:我想输出是正是这一点
推理是这样的:有时候,仅仅是一个拥有由“/”分割字文本。 我想之前加空格和后所以它的“/”代替。 但有时在同一个节点具有XML在里面。
some <super>1</super> text here
您可以测试,看看是否当前节点有孩子:
<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>
实际上,在所描述的情况,文本()返回两个文本节点的序列,“一些”和“文字在这里”,但是在XSLT 1.0,在节点序列(或一组)的许多操作忽略除第一个所有节点。
你还没说你想要的输出。 但处理混合内容的常用方法是调用应用模板来处理所有的孩子们。 明确使用文本的()是很少做正确的事。
测试或谓词count(text()) = count(node())
应该努力使区别。
这个样式表:
<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()
的模式。