2016-06-07 26 views
0

我不確定爲什麼這個applly-templates不起作用,我在我的XSL文件中調用了一個模板來搜索元素以獲得答案「 YES「然後繼續使用另一個模板,但這是它結束的地方,因爲我似乎無法獲得下一個模板。 (使用XSLT 1.0)如何應用 - 使用子字符串搜索匹配節點的兄弟節點的模板

示例XML(這是從更大的XML摘錄只是告訴你的點)

<Properties> 
    ... 
    <benCut_1__1_ formula="">Yes</benCut_1__1_> 
    <CTRRad_1__2_ formula="">Yes</CTRRad_1__2_> 
    <CBlRad_1__2_ formula="">Yes</CBlRad_1__2_> 
    <CBRRad_1__2_ formula="">Yes</CBRRad_1__2_> 
    <CTLRad_1__2_ formula="">Yes</CTLRad_1__2_> 
    <CBlRad_1__3_ formula="">Yes</CBlRad_1__3_> 
    <CBRRad_1__3_ formula="">Yes</CBRRad_1__3_> 
    <CTLRad_1__3_ formula="">Yes</CTLRad_1__3_> 
    <CTRRad_1__3_ formula="">Yes</CTRRad_1__3_> 
    <bencut_1__2_ formula="">Yes</bencut_1__2_> 
    <benCut_2__1_ formula="">Yes</benCut_2__1_> 
    <benCutH_2__1_ formula="">21mm</benCutH_2__1_> 
    <benCutW_2__1_ formula="">21mm</benCutW_2__1_> 
    <benCutx_2__1_ formula="">21mm</benCutx_2__1_> 
    <benCutY_2__1_ formula="">21mm</benCutY_2__1_> 
    <benCTR_2__1_ formula="">21mm</benCTR_2__1_> 
    <benCTl_2__1_ formula="">21mm</benCTl_2__1_> 
    ... 
</Properties> 

首先我適用模板來搜索任何的「benCut_」的或「bencut_」的結果是數據出現不同的情況(這個問題與這個問題是分開的)。

<xsl:template match="Properties" > 
     <xsl:apply-templates select="*[contains(translate(name(),'BENCUT','bencut'),'bencut_')]" /> 
</xsl:template> 

然後,我需要運行的下一個應用模板到任何一個有值「是」的「bencut_」,並查找字符串(最後6個字符創建一個匹配字符串的結尾發現在XML其他值,我需要提取作爲一個羣體和現在不同

<xsl:template match="*[contains(translate(name(),'BENCUT','bencut'),'bencut_')]" > 
    <xsl:if test="text()='Yes'"> 
     <xsl:apply-templates select="following-sibling::*[contains(name(),substring(name(),string-length(name())-5))]" /> 
    </xsl:if> 
</xsl:template> 

這是它開始失敗,因爲我需要檢查「bencut_」節點包含相同的尾兄弟姐妹字符串,他們可以在前面或後面 (我刪除了我原來選擇的'以下兄弟:: [contains(name(),su bstring(name(),string-length(name()) - 5))]前同步:: [包含(名稱(),子串(名稱(),字符串長度(名稱()) - 5)]''嘗試和調試代碼)

[也真的不確定爲什麼「|」在另一種情況下工作時,「和」如果任何人都不會有解釋]

這是我最後的模板,我將要運行,這將是格式化我發現每個其他兄弟姐妹看起來和呈現像。

<xsl:template match="following-sibling::*[contains(name(),substring(name(),string-length(name())-5))]" > 
    <xsl:value-of select="name()" /> 
</xsl:template> 

最終的結果是要找到所有例如匹配的尾巴「_1__2_」,並能看到下面的數據在考慮之類的東西CTRRad_1__2_是摳圖右上半徑。

摳圖(1)第(2)節; 右上半徑 - 是 左下半徑 - 是 開孔高度 - 21毫米 切面寬度 - 21毫米 ...

會有1-3節1-11缺口,即33個可能的缺口塊。

+0

你忘了提供從改造所需的結果。請提供。 –

+0

@Dimitre - 提供了示例,我想讀取所有* _1__2_元素,每個元素都以不同的部分開頭,所以當我看到CTRRad時會出現「CTRRad_1__2_」和「CTLRad_1__2_」*我想再運行另一個將它改爲「Cutout Top Right Radius」,它會識別模板的部分字符串,讓我陷入困境,剩下的我可以自己做,所以如果您可以循環所有匹配的「_1__2_」和所有的「_1__3_」等,然後仍然能夠看到名稱()的開始,以確定下一部分。 –

+0

@Alastair,如果您在問題中提供了所有內容,則可以使其成爲最容易的幫助,並在必要時對其進行編輯。如果你從字面上提供你期望的片段作爲結果,它會比散文解釋更有幫助(儘管這可能會增加更多相關信息) –

回答

1

很難理解你的問題到底是什麼。首先,你說:

啓動失敗,因爲我需要檢查 的「bencut_」節點包含相同的尾部字符串的兄弟姐妹,他們可能是 前述或者以下

然後你說:

它承認有我 難倒模板的部分列,

嘗試以此爲起點:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/Properties"> 
    <root> 
     <xsl:apply-templates select="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')][.='Yes']" /> 
    </root> 
</xsl:template> 

<xsl:template match="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')]"> 
    <xsl:variable name="key" select="substring(name(), string-length(name()) - 5)" /> 
    <group key="{$key}"> 
     <xsl:apply-templates select="../*[contains(name(), $key)]" mode="group"/> 
    </group> 
</xsl:template> 

<xsl:template match="*" mode="group"> 
    <xsl:copy-of select="." /> 
</xsl:template> 

</xsl:stylesheet> 

應用到你的輸入例子,結果將是:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <group key="_1__1_"> 
     <benCut_1__1_ formula="">Yes</benCut_1__1_> 
    </group> 
    <group key="_1__2_"> 
     <CTRRad_1__2_ formula="">Yes</CTRRad_1__2_> 
     <CBlRad_1__2_ formula="">Yes</CBlRad_1__2_> 
     <CBRRad_1__2_ formula="">Yes</CBRRad_1__2_> 
     <CTLRad_1__2_ formula="">Yes</CTLRad_1__2_> 
     <bencut_1__2_ formula="">Yes</bencut_1__2_> 
    </group> 
    <group key="_2__1_"> 
     <benCut_2__1_ formula="">Yes</benCut_2__1_> 
     <benCutH_2__1_ formula="">21mm</benCutH_2__1_> 
     <benCutW_2__1_ formula="">21mm</benCutW_2__1_> 
     <benCutx_2__1_ formula="">21mm</benCutx_2__1_> 
     <benCutY_2__1_ formula="">21mm</benCutY_2__1_> 
     <benCTR_2__1_ formula="">21mm</benCTR_2__1_> 
     <benCTl_2__1_ formula="">21mm</benCTl_2__1_> 
    </group> 
</root> 

附:

更高效的版本將使用關鍵

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="elem-by-tail" match="*" use="substring(name(), string-length(name()) - 5)" /> 

<xsl:template match="/Properties"> 
    <root> 
     <xsl:apply-templates select="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')][.='Yes']" /> 
    </root> 
</xsl:template> 

<xsl:template match="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')]"> 
    <xsl:variable name="key" select="substring(name(), string-length(name()) - 5)" /> 
    <group key="{$key}"> 
     <xsl:apply-templates select="key('elem-by-tail', $key)" mode="group"/> 
    </group> 
</xsl:template> 

<xsl:template match="*" mode="group"> 
    <xsl:copy-of select="." /> 
</xsl:template> 

</xsl:stylesheet> 
+0

我喜歡你在那裏用那個@Michael做的事情,可以看到我在我的問題中實現了什麼,在我的生活版本中我略微有些不同,但是我用我在例子中看到的改變了我的實際這樣做,謝謝。 –

相關問題