Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
Xml 从元素或子元素获取文本()_Xml_Xslt - Fatal编程技术网

Xml 从元素或子元素获取文本()

Xml 从元素或子元素获取文本(),xml,xslt,Xml,Xslt,我正在进行以下工作(使用)。我需要从以下任一位置提取text(): <para> <emphasis role="italic">(0008,0001)</emphasis> </para> (0008,0001) 或者(简单地说): (00080005) 我想到的(请仅限XSLT 1.0)是以下内容(完整脚本): 我觉得它很难看,也很麻烦,还有其他(更简单的)方法吗?根据输入,只需使用就足够了。这将为显示的两个输入片段选择相同的值,即

我正在进行以下工作(使用
)。我需要从以下任一位置提取
text()

<para>
<emphasis role="italic">(0008,0001)</emphasis>
</para>

(0008,0001)
或者(简单地说):

(00080005)
我想到的(请仅限XSLT 1.0)是以下内容(完整脚本):



我觉得它很难看,也很麻烦,还有其他(更简单的)方法吗?

根据输入,只需使用
就足够了。这将为显示的两个输入片段选择相同的值,即字符串值
(00080001)

但是,我不知道您的输入数据是否有需要保留的空白(例如,
abc efg
),使用建议的方法,变量将保留字符串
abc efg

如果您使用
,则两个输入样本都将生成具有相同字符串值的para元素,因此您甚至可以使用
,并且数据中的任何空白(如我的样本
abc efg
)都将被保留


我永远不会在XSLT/XPath中使用显式的
text()
选择,除非我需要处理混合内容(或者知道我正在使用一些特定的API,比如一些Python XPath API,其中显式的
text()
选择会返回一个智能字符串,而不是一个文本节点).

根据输入,只需使用
即可。这将为显示的两个输入片段选择相同的值,即字符串值
(00080001)

但是,我不知道您的输入数据是否有需要保留的空白(例如,
abc efg
),使用建议的方法,变量将保留字符串
abc efg

如果您使用
,则两个输入样本都将生成具有相同字符串值的para元素,因此您甚至可以使用
,并且数据中的任何空白(如我的样本
abc efg
)都将被保留


无论如何,我都不会在XSLT/XPath中使用显式的
text()
选择,除非我需要处理混合内容(或者知道我正在使用某些特定的API,比如一些Python XPath API,其中显式的
text()
选择会返回一个智能字符串而不是文本节点)。

:

<xsl:apply-templates select=
                     "dk:td[1]/dk:para/dk:emphasis | dk:td[1]/dk:para[not(dk:emphasis)]"/>

说明

<xsl:apply-templates select=
                     "dk:td[1]/dk:para/dk:emphasis | dk:td[1]/dk:para[not(dk:emphasis)]"/>
这将在任何
dk:td[1]/dk:para/dk:emphasis
元素和任何
dk:td[1]/dk:para[not(dk:emphasis)]
元素上为元素选择XSLT内置模板。最后一个匹配模式意味着:没有子元素的任何
dk:td[1]/dk:para
元素


内置模板的作用是输出当前节点的所有文本节点子节点的串联—在本例中,元素有一个子文本节点—因此这就是输出。

只需使用即可:

<xsl:apply-templates select=
                     "dk:td[1]/dk:para/dk:emphasis | dk:td[1]/dk:para[not(dk:emphasis)]"/>

说明

<xsl:apply-templates select=
                     "dk:td[1]/dk:para/dk:emphasis | dk:td[1]/dk:para[not(dk:emphasis)]"/>
这将在任何
dk:td[1]/dk:para/dk:emphasis
元素和任何
dk:td[1]/dk:para[not(dk:emphasis)]
元素上为元素选择XSLT内置模板。最后一个匹配模式意味着:没有子元素的任何
dk:td[1]/dk:para
元素


内置模板的作用是输出当前节点的所有文本节点子节点的串联——在这种情况下,元素有一个子文本节点——因此这就是输出。

是的,
很麻烦,但至少可以缩短为
。对于一般问题,不清楚是什么决定了你想选择哪个元素,你说要么/要么,然后显示两个具有不同
xml:id
属性的元素,它们相关吗?输入可以同时具有这两种类型的元素吗?你想要哪一种?我删除了
xml:id
,因为我没有在这个级别上使用它们为什么不为text()编写模板呢dk:以正常方式强调?我赞同@C.M.Sperberg-McQueen的建议。事实上,从我的回答中可以看出,甚至不需要编写任何新模板,因为XSLT内置模板完全按照这种情况下的需要来做。是的,
很麻烦,但至少可以缩短为
。对于通用pro问题,不清楚是什么决定了要选择哪个元素,你说要么/要么,然后显示两个具有不同
xml:id
属性的元素,这些相关吗?输入可以同时具有这两种类型的元素吗?你想要哪一种?我删除了
xml:id
,因为我没有在这个级别上使用它们为什么不为它们编写模板呢text()和dk:以正常方式强调?我赞同@C.M.Sperberg-McQueen的建议。事实上,从我的回答中可以看出,甚至不需要编写任何新模板,因为XSLT内置模板正是这种情况下所需要的。