2016-12-03 48 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()選擇,那麼給你回一個聰明的字符串,而不是文本節點)

相關問題