如果text()
返回的所有内容都是纯文本字符串,则希望对节点的文本内容进行一些解析/修改。里面没有XML。
例如
<test>some <super>1</super> text here</test>
text()
的{{1}}只返回“some”。这是我不想要输出文本而是想调用apply-templates的情况。
无论如何要告诉或者这种情况对于XSL来说是否过于模糊?
编辑: 我想要的输出就是这个
推理是这样的:有时只有一个单词被“/”分隔的文字。我想在之前和之后添加空格,所以它是“/”而不是。但有时同一节点中有xML。
<test>
答案 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()
作为模式。