2012-07-10 119 views
0

基本上,我在尋找的this從子節點選擇文本,而忽略文本節點

我處理的XML的一個例子相反:

<profiledesc> 
    <creation> 
     Finding Aid encoded by Some Guy, <date normal="2011-09-21">21 September 2011</date> 
    </creation> 
    <langusage encodinganalog="546"> 
     Finding aid written in 
     <language langcode="eng" scriptcode="latn" encodinganalog="041"> 
     English 
     </language> 
    </langusage> 
</profiledesc> 

的XSLT我的例子「M書面方式(只有相關部分):

<xsl:template priority="3" match="descgrp|eadheader|filedesc|titlestmt|profiledesc|archdesc|langusage|did"> 
    <xsl:apply-templates select="./child::node()"/> 
</xsl:template> 

<xsl:template priority="2" match="language"> 
    <atom name="EADLanguageOfFindingAid" type="text" size="short"> 
     <xsl:value-of select="."/> 
    </atom> 
    <atom name="EADLanguageCodeOfFindingAid" type="text" size="short"> 
     <xsl:value-of select="normalize-space(@langcode)"/> 
    </atom> 
</xsl:template> 

... Other templates, for nodes like 'creation' .... 

的(壞)輸出我得到的一個例子:

... Some other tags ... 
<atom name="EADCreation" type="text" size="short">Finding Aid encoded by Some Guy, 21 September 2011</atom> 
Finding aid written in 
<atom name="EADLanguageOfFindingAid" type="text" size="short"> English </atom> 
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom> 
... Some other tags ... 

的(好)輸出的一個例子,我想

... Some other tags ... 
<atom name="EADCreation" type="text" size="short">Finding Aid encoded by Some Guy, 21 September 2011</atom> 
<atom name="EADLanguageOfFindingAid" type="text" size="short"> English </atom> 
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom> 
... Some other tags ... 

注意的是,在第二輸出線的「寫在尋找援助」缺少。因此,正如你所看到的,我設計了模板來輸出只是「langusage」標籤的「語言」部分,但是整個標籤,包括「Finding aid in written」文本節點,正在輸出代替。我不能確定文本節點是否存在,或者它將是第一個(或最後一個,還是在任何特定位置)。我也不能確定只有一個文本節點或一個子節點。所以,我不能使用依賴於簡單地選擇「[第x個]」節點(子節點或文本)的任何解決方案。

在這一點上,我會很感激任何建議,甚至有些關鍵字可以幫助我通過Google找到解決方案(到目前爲止我還沒有運氣)。

+1

您需要準確顯示您想要的輸出。對我來說並不清楚,並且您不會通過詢問輸出如'Finding Aid encoded by ...'(使用省略號)而實際上不出現在您的原始文檔中。我應該如何知道你認爲應該出現在「......」的位置?我無法讀懂你的想法。 – 2012-07-10 19:14:17

+0

@lwburk - 謝謝你讓我知道你發現的問題不清楚。我填寫了更多的示例輸出。更好的是,我在示例下方以粗體文本的方式添加了一行以明確我要找的內容。我希望有所幫助。 – aarondev 2012-07-10 19:57:29

+0

我還沒有*完全*確定我明白,但我想你想要的只是選擇*元素*的孩子。我會爲此添加一個答案,希望它對一些人有所幫助。 – 2012-07-11 05:16:12

回答

1

這聽起來像你只需要選擇子元素langusage,而不是所有的子節點(任何類型的,這是什麼node()選擇(不包括屬性節點和根節點)的)。

例如,該樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="langusage"> 
     <xsl:apply-templates select="*"/> 
    </xsl:template> 
    <xsl:template match="language"> 
     <atom name="EADLanguageOfFindingAid" type="text" size="short"> 
      <xsl:value-of select="normalize-space()"/> 
     </atom> 
     <atom name="EADLanguageCodeOfFindingAid" type="text" size="short"> 
      <xsl:value-of select="normalize-space(@langcode)"/> 
     </atom> 
    </xsl:template> 
</xsl:stylesheet> 

應用於此簡化的輸入:

<profiledesc> 
    <langusage encodinganalog="546"> 
     Finding aid written in 
     <language langcode="eng" scriptcode="latn" encodinganalog="041"> 
     English 
     </language> 
     <language langcode="esp" scriptcode="latn" encodinganalog="042"> 
     Spanish 
     </language> 
    </langusage> 
</profiledesc> 

產生以下輸出:

<atom name="EADLanguageOfFindingAid" type="text" size="short">English</atom> 
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom> 
<atom name="EADLanguageOfFindingAid" type="text" size="short">Spanish</atom> 
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">esp</atom> 

的不需要的文本 - 查找輔助寫在 - 不會出現在輸出中。

注意,*在:

<xsl:apply-templates select="*"/> 

...只是說child::*較短的方式。都選擇當前節點的所有元素子元素。

+0

謝謝!我正要修改這個問題,因爲我發現將'child :: node()'改爲'./*'解決了這個問題。現在我很好奇爲什麼。似乎'node()'選擇所有節點,甚至文本節點,而'*'只選擇元素子節點。正確? – aarondev 2012-07-11 13:40:10

+0

@aarondev - 是的。 'node()'選擇除屬性和根節點之外的任何節點類型,而'*'只選擇元素。 – 2012-07-11 14:23:50

+0

更一般地說:*主節點類型的任何節點的節點測試*均爲真。例如,child :: *將選擇上下文節點的所有元素子元素,而attribute :: *將選擇上下文節點的所有屬性。* http://www.w3.org/TR/xpath/#node-tests – 2012-07-11 14:29:45