我一直在绞尽脑汁,但似乎无法正确使用,而且我没有找到正确的关键字Google ..在使用XPath的复杂XML元素中选择白色空间文本节点中的子文本节点
我最近开始使用XSLT和XPath来创建自然语言词汇表的XML描述 - 用于我的项目。
问题是我选择了对某些单词使用“混合内容”复杂元素,并且在某些情况下只想获取文本节点。
这里的XML文档的一部分:
...
<entry category="substantiv">
<word lang="sv">semester</word>
<word lang="de">
<article>der</article>Urlaub
<plural>Urlaube</plural>
</word>
</entry>
...
有我的文档中的许多入门元素,在这种情况下我想通过获取“Urlaub”:/entry/word[@lang='de']/text()
这是因为我的换行符的,不会工作。我发现实际上有三个文本节点.. .../text()[2]
当然会工作..但是,我不知道哪里会有换行符,或者有多少。如果XML被格式化像下面,我该路径的第一个版本将工作,但不是第二:
...
<word lang="de"><article>der</article>Urlaub
<plural>Urlaube</plural>
</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文档中。
UPDATE2: 我现在用的<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”后,仍然增加。
当我需要达到的文本节点“Urlaub”的XSLT文档之外我用:
<xsl:value-of select="normalize-space(word[@lang='de']/text()[normalize-space() != ''])" />
感谢所有帮助乡亲!
更新3: 试图改善标题
如果没有相关的XSLT上下文,就无法自信地回答。请添加您正在努力解决的问题的XSLT代码以及您的实际意图(即所需输出)。 – Tomalak 2010-08-09 18:50:17
@Tomalak,我没有在XSLT,只有XPath部分挣扎。但我补充说,以防万一它可能摆脱一些需要的光。 – nimbus77 2010-08-09 20:57:15
除了重点之外,你并没有在XSLT中挣扎。 ;)显示你的代码是有帮助的,因为XSLT和XPath是如此密切相关,许多问题可能有与你目前尝试的不同的解决方案。 - 看到我改变的答案。 – Tomalak 2010-08-09 21:11:09