我有以下mix-content元素:
<firstElement type="random">text1<secondElement>random_value</secondElement>text2</firstElement>
我想在for-each
子节点上使用嵌套<firstElement>
条件进行if
循环,例如:
<xsl:for-each select="child::*">
<xsl:if test="some test">
<xsl:copy>
</xsl:if>
</xsl:for-each>
如何编写仅选择test
的文本节点的<firstElement>
?
我尝试使用text()
,但它仅适用于上下文节点的子文本节点,self::text()
似乎不是正确的Xpath。我还尝试使用XSLT 2.0 instance of
来测试xs:string
,但它也没有用。
答案 0 :(得分:2)
如何编写仅选择文本节点的测试
<firstElement>
?
很难理解你的问题:
首先,测试不会选择任何东西 - 我想你的意思是你希望测试仅传递文本节点。
接下来,当你这样做时:
<xsl:for-each select="child::*">
您只选择元素节点 - 因此任何仅通过 text 节点的后续测试将始终返回false。
还不清楚为什么你需要首先选择不文本节点的任何节点,然后测试它们并仅传递文本节点。但是假设你真的想做什么,你可以这样做:
<xsl:template match="firstElement">
<output>
<!-- select all child nodes -->
<xsl:for-each select="node()">
<!-- pass only text nodes -->
<xsl:if test=". instance of text()">
<xsl:copy/>
</xsl:if>
</xsl:for-each>
</output>
</xsl:template>
返回:
<output>text1text2</output>
与更简单的返回结果相同:
<xsl:template match="firstElement">
<output>
<xsl:copy-of select="text()"/>
</output>
</xsl:template>
我尝试使用
text()
,但它仅适用于上下文节点的子文本节点,而self::text()
似乎不是正确的X路径。
我不确定你为什么这么认为。
<xsl:if test="self::text()">
同样适用 - 并且具有向后兼容XSLT 1.0的优势。