【问题标题】:Match text node in element with sub elements将元素中的文本节点与子元素匹配
【发布时间】:2021-11-09 19:32:19
【问题描述】:

我遇到了与中所述相同的问题 How to get text from the node in xml file, that contains text and child node? 但我需要 XSLT 来匹配文本。

我有以下简化的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<order>2013-09-02T00:00:00COPY
<contentVersion>
    <versionIdentification>2.1.1</versionIdentification>
</contentVersion>
</order>

我尝试了以下 XPATH:

<xsl:variable name="vtextPostM" select="text()[self::order]"/>
<xsl:variable name="vtextPostM" select="self::text()[1]"/>
<xsl:variable name="vtextPostM" select="text()[self::*]"/>

我期待:

2013-09-02T00:00:00COPY

【问题讨论】:

  • 上下文是什么?你能发布你的整个xslt路径吗?你用的是什么xslt处理器?一个可重复的例子真的很有帮助。如果您对 2013... 字符串感兴趣,为什么要包含 contentVersion 节点?

标签: xml xslt xpath


【解决方案1】:

哎呀,刚刚编辑了我的答案:

<xsl:variable name="vtextPostM" select="order/child::node()[position()=1][self::text()]"/>

【讨论】:

  • 不,你不能。 child::* 轴不包含文本节点。
  • 但是为什么&lt;xsl:variable name="vtextPostM" select="order/child::*[position()=1][self::text()]"/&gt;&lt;xsl:template match="contentVersion"&gt;&lt;xsl:value-of select="$vtextPostM"/&gt;&lt;/xsl:template&gt; 如果没有选中想要的文本节点呢?
  • 对不起,child::* 当然包含文本节点(不像*)。
  • 虽然在给定的示例中可能不明显,但“第一个文本节点”和“第一个节点,只要它是文本”之间存在 区别。
  • 感谢 Joel 的解决方案 - 它运行良好 (+1)。不过,我会选择迈克尔的那个,因为我不需要检查职位。谢谢你,彼得
【解决方案2】:

当您定义变量时,您到底在哪里?没有任何上下文,绝对路径:

/order/text()[1]

或只是(使用您的具体示例):

/order/text()

应该会产生你想要的结果。您需要将其包装在 normalize-space() 中,因为它包含&lt;contentVersion&gt; 之前的尾随换行符。

【讨论】:

  • 你好迈克尔,谢谢。我会选择你的解决方案。我的错误是我没有在我的 XPATH 中正确考虑当前节点(顺序)。学习到教训了。最好的问候,彼得
猜你喜欢
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 2017-02-16
  • 2014-10-29
  • 1970-01-01
相关资源
最近更新 更多