Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在XSLT中测试文本节点_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

在XSLT中测试文本节点

在XSLT中测试文本节点,xslt,xpath,xslt-2.0,Xslt,Xpath,Xslt 2.0,我有以下混合内容元素: <firstElement type="random">text1<secondElement>random_value</secondElement>text2</firstElement> 如何编写只选择的文本节点的测试 我尝试了text(),但它只适用于上下文节点的子文本节点,而且self::text()似乎不是一个合适的Xpath。我还尝试使用XSLT2.0的实例对xs:string进行测试,但也没有成功 如何编写

我有以下混合内容元素:

<firstElement type="random">text1<secondElement>random_value</secondElement>text2</firstElement>
如何编写只选择
的文本节点的
测试

我尝试了
text()
,但它只适用于上下文节点的子文本节点,而且
self::text()
似乎不是一个合适的Xpath。我还尝试使用XSLT2.0
实例对
xs:string
进行测试,但也没有成功

如何编写只选择文本节点的测试

你的问题真的很难理解:

首先,测试不选择任何内容—我想您的意思是希望测试只通过文本节点

接下来,当您这样做时:

<xsl:for-each select="child::*">
同样有效——并且具有向后兼容XSLT1.0的优势

如何编写只选择文本节点的测试

你的问题真的很难理解:

首先,测试不选择任何内容—我想您的意思是希望测试只通过文本节点

接下来,当您这样做时:

<xsl:for-each select="child::*">

同样有效——并且具有向后兼容XSLT 1.0的优势。

也许您理解我的问题的困难来自于错误的设计选择。我希望对文本节点和
firstElement
中的其他节点执行不同的转换,并且仅在该特定元素中执行。为此,我编写了两个不同的模板:一个用于作为firstElement子元素的文本节点,另一个用于firstElement的其他元素子元素。但为了清晰起见,我认为最好是在一个模板中同时进行两个转换。这就是为什么我想使用一个for-each循环和嵌套的if条件。谢谢,我使用了
。text()的实例,它工作正常。你能再帮我一点吗?我不完全理解这里每个
循环的
行为。当我选择元素节点时,例如使用
if
语句,使用
apply templates
仅复制元素的文本内容。我需要指定
apply templates select=“”
,以便应用匹配的模板。为什么?在
xsl:for each
中使用
apply-templates-select=“.”“
没有什么意义。如果要将模板应用于所选节点,则直接应用它,使用
apply templates
而不是
xsl:for each
。在任何情况下,
apply templates
的默认选择都是上下文节点的子节点。可能您理解我的问题的困难来自错误的设计选择。我希望对文本节点和
firstElement
中的其他节点执行不同的转换,并且仅在该特定元素中执行。为此,我编写了两个不同的模板:一个用于作为firstElement子元素的文本节点,另一个用于firstElement的其他元素子元素。但为了清晰起见,我认为最好是在一个模板中同时进行两个转换。这就是为什么我想使用一个for-each循环和嵌套的if条件。谢谢,我使用了
。text()的实例,它工作正常。你能再帮我一点吗?我不完全理解这里每个
循环的
行为。当我选择元素节点时,例如使用
if
语句,使用
apply templates
仅复制元素的文本内容。我需要指定
apply templates select=“”
,以便应用匹配的模板。为什么?在
xsl:for each
中使用
apply-templates-select=“.”“
没有什么意义。如果要将模板应用于所选节点,则直接应用它,使用
apply templates
而不是
xsl:for each
。在任何情况下,
apply templates
的默认选择都是上下文节点的子节点。
<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>
<xsl:if test="self::text()">