【发布时间】:2010-08-09 18:33:29
【问题描述】:
我一直在为此绞尽脑汁,但似乎无法正确解决,而且我在 Google 上没有找到正确的关键字..
我最近开始使用 XSLT 和 XPath 来为我的一个项目创建自然语言词汇表的 XML 描述。
问题是我选择对某些单词使用“混合内容”复杂元素,并且在某些情况下只想获取文本节点。
这是 XML 文档的一部分:
...
<entry category="substantiv">
<word lang="sv">semester</word>
<word lang="de">
<article>der</article>Urlaub
<plural>Urlaube</plural>
</word>
</entry>
...
我的文档中有很多入口元素,在这种情况下,我想使用 /entry/word[@lang='de']/text() 获取“Urlaub”,因为我的换行符不起作用。我发现实际上有三个文本节点.. .../text()[2] 当然可以工作.. 但是,我事先不知道哪里会有换行符,或者有多少。如果 xml 格式如下,我的第一个版本的路径将起作用,但不是第二个:
...
<word lang="de"><article>der</article>Urlaub
<plural>Urlaube</plural>
</word>
...
我想我想做的是选择 word[@lang='de'] 的所有直接文本节点,然后使用normalize-space() 删除不必要的空格。但是,我如何使用 XPath 做到这一点?或者,还有更好的方法?这似乎很容易,但我无法弄清楚。顺便说一下,我正在尝试在 XSLT 文档中执行此操作。
normalize-space(/entry/word[@lang='de']/text()[*]) 是我尝试过的事情之一,但这似乎做了别的事情。
/感谢任何帮助。
更新:
根据要求,这是 XSLT 的一部分:
...
<xsl:choose>
<xsl:when test="@category='substantiv'">
<em><xsl:value-of select="word[@lang='de']/article" /></em>
<xsl:value-of select="normalize-space(word[@lang='de']/text()[2])" />
<em>pl. <xsl:value-of select="word[@lang='de']/plural" /></em>
</xsl:when>
...
此代码适用于第一个版本的格式化。澄清一下,我想要做的是在复杂元素<word lang="de"> 中获取文本节点的值,尽管它可能是用换行符和空格格式化的。我将如何处理该值取决于上下文,但现在我只是将它放在一个 xhtml 文档中。
更新 2:
我现在使用<xsl:strip-space elements="*"/>,它消除了文本节点为空的问题。我也在使用:
...
<xsl:choose>
<xsl:when test="@category='substantiv'">
<em><xsl:value-of select="word[@lang='de']/article" /></em>
<xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(word[@lang='de']/text())" />
<xsl:text>, </xsl:text>
<em>pl. <xsl:value-of select="word[@lang='de']/plural" /></em>
</xsl:when>
...
仍然需要规范化,因为在 XML 中的“Urlaub”之后仍然添加了一个空格。
当我需要访问我使用的 XSLT 文档之外的文本节点“Urlaub”时:<xsl:value-of select="normalize-space(word[@lang='de']/text()[normalize-space() != ''])" />
感谢所有帮助的人!
更新 3: 试图改进标题
【问题讨论】:
-
如果没有相关的 XSLT 上下文,就无法自信地回答这个问题。请在您的问题中添加您正在努力解决的 XSLT 代码,以及您的实际意图(即想要的输出)。
-
@Tomalak,我不是在为 XSLT 苦苦挣扎,而是在 XPath 部分苦苦挣扎。但我添加了它以防万一它可能会提供一些必要的信息。
-
您没有在 XSLT 上苦苦挣扎,这不是重点。 ;) 显示您的代码很有帮助,因为 XSLT 和 XPath 相互关联非常密切,并且许多问题的解决方案可能与您当前尝试的解决方案不同。 -- 查看我更改后的答案。
-
是的,你完全正确。 XML 开启了一个全新的美妙世界,但它有时会让人非常困惑.. :)