2016-12-03 52 views
0

我以下document的工作文字()(使用<xsl:apply-templates select="*/*/dk:table[@xml:id='table_6-1']" />)。我需要从任一提取text()快速从一个元素或子元素

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

或(简单):

<para>(0008,0005)</para> 

我想出什么了(XSLT 1.0只能拜托)如下(完整的脚本here):

<xsl:variable name="vm"> 
    <xsl:choose> 
    <xsl:when test="dk:td[1]/dk:para/dk:emphasis"> 
     <xsl:value-of select="dk:td[1]/dk:para/dk:emphasis/text()"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="dk:td[1]/dk:para/text()"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

我觉得很丑陋,很麻烦,有没有其他的(simplier)的方式?

+0

是,'的'是麻烦的,但至少可以缩短到'的'。至于一般问题,目前还不清楚什么决定了你想选择哪个元素,你说/或者显示两个具有不同'xml:id'属性的元素,这些是相关的吗?输入是否可以包含这两种元素?你想要哪一个? –

+0

我删除了'xml:id',因为我没有在这个级别使用它们 – malat

+2

为什么不直接用正常的方式编写text()和dk:emphasis的模板? –

回答

3

只需使用

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

说明

这将选择XSLT内置的模板元素,任何dk:td[1]/dk:para/dk:emphasis元素和任何dk:td[1]/dk:para[not(dk:emphasis)]元素上。最后一个匹配模式表示:没有dk:emphasis孩子的任何dk:td[1]/dk:para元素。

内置模板的操作是输出当前节点的所有文本节点后代的连接 - 在这种情况下,该元素具有单个子文本节点 - 因此完全是输出。

0

取决于它可能足以简单地使用<xsl:variable name="vm" select="normalize-space(dk:td[1]/dk:para)"/>输入。这将为您显示的两个输入片段选择相同的值,即字符串值(0008,0001)

但是,我不知道如果您的输入数据可以有空白空间(例如<para>abc efg</para>),您需要使用建议的方法保存字符串abc efg

如果使用<xsl:strip-space elements="*"/><xsl:strip-space elements="dk:td"/>那么这两个输入样本将导致与相同的字符串值para元素,所以你能那么即使使用数据<xsl:variable name="vm" select="dk:td[1]/dk:para"/>和任何空白(就像我的样品<para>abc efg</para>将被保留。

我绝不会使用XSLT/XPath的明确text()选择反正,除非我需要处理混合内容(或知道我使用像一些Python的XPath API的一些特定的API,其中明确text()选择,那么给你回一个聪明的字符串,而不是文本节点)

相关问题