在XSLT

时间:2017-04-29 22:23:58

标签: xslt xpath xslt-2.0

我有以下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,但它也没有用。

1 个答案:

答案 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的优势。