2013-05-14 36 views
2

從XML需要平面文件自定義的順序,我想創建使用XSLT用的次序爲此輸出XML平面文件,如下所示:使用XSLT

NM1 * CC * 1 *史密斯*約翰*** * 34 * 999999999〜
N3×100大街〜

從這個XML:

<Claim> 
<Claimant 
    lastName="Smith" 
    firstName="John" 
    middleName="" 
    suffixName="" 
    indentificationCodeQualifier="34" 
    identificationCode="999999999"> 
    <ClaimantStreetLocation 
     primary="100 Main Street" 
     secondary=""/> 
</Claimant> 
</Claim> 

隨着我創建我得到如下所示以相反的期望的順序輸出的XSLT由於性質XSLT是如何工作的,因爲它遍歷輸入樹我假設:

N3 * 100主街〜
NM1 * CC * 1 *史密斯*約翰**** 34 * 999999999〜

什麼我需要更改/添加讓我尋找到訂單我寫的XSLT所示: `

<xsl:template match="Claim/Claimant"> 
    <xsl:apply-templates /> 
    <xsl:text>NM1*CC*1*</xsl:text> 
    <xsl:value-of select="@lastName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@firstName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@middleName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@suffixName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@indentificationCodeQualifier" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@identificationCode" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template> 

<xsl:template match="Claim/Claimant/ClaimantStreetLocation"> 
    <xsl:apply-templates /> 
    <xsl:text>N3*</xsl:text> 
    <xsl:value-of select="@primary" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template>` 

有沒有辦法做到這一點沒有兩個標籤組合成一個?

任何反饋將不勝感激。

我不知道它是否重要,但我使用xalan-java處理代碼中的xslt。

回答

2

如果你要處理的前兒童家長,你應該將應用模板到父模板的結尾:

<xsl:template match="Claim/Claimant"> 
    <xsl:text>NM1*CC*1*</xsl:text> 
    <xsl:value-of select="@lastName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@firstName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@middleName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@suffixName" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@indentificationCodeQualifier" /> 
    <xsl:text>*</xsl:text> 
    <xsl:value-of select="@identificationCode" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="ClaimantStreetLocation"> 
    <xsl:apply-templates /> 
    <xsl:text>N3*</xsl:text> 
    <xsl:value-of select="@primary" /> 
    <xsl:text>~</xsl:text> 
    <xsl:text> 
    </xsl:text> 
</xsl:template>` 

更新:這裏發生的事情是:

  1. 處理的第一個元素是Claim,但沒有與之匹配的模板,因此將應用默認模板,該模板處理其子節點的模板。

  2. 在那裏,第一個孩子是索賠人,而且你確實有一個匹配它的模板,所以它被應用。

  3. 接下來,該模板按順序處理。但關鍵點在於apply-templates在默認選擇中省略了屬性(請參閱 What is the default select of XSLT apply-templates?),因此唯一匹配的節點是ClaimantStreetLocation元素。

  4. 鑑於您有一個與ClaimantStreetLocation匹配的模板,它將被應用。所以,如果你想首先處理屬性,你應該延遲apply-templates,直到它們被選中,在你的情況下,手動。

+1

謝謝你Shrein!這工作。但是如何將移動到父項的底部,導致父項先運行。如果我需要在ClaimantStreetLocation模板後面添加新行,是否應該命名這些標記? – user2382922

+0

添加了對答案的解釋。希望能幫助到你。 – Shrein

+0

這很有道理。感謝Shrein的解釋! – user2382922