2013-05-16 37 views
1

我一直在想這個我們有一段時間,但沒有運氣。xsl:for-each循環的屬性與參數匹配

我有一個專門針對具有特定屬性的節點的每個循環,但不知何故每個條件似乎並沒有工作。

我有以下XML

<?xml version="1.0" encoding="UTF-8"?> 
<application-template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<config> 
<env value="testing"> 
<subEnv value="env"> 
<group value="group2s"> 
<group value="group2as"> 
<prop value="group2Props">group2PropValues</prop> 
</group>  
</group> 
</subEnv> 
<subEnv value="misc1"> 
<group value="group2s"> 
<group value="group2as"> 
<prop value="group2Props">group2sPropValues</prop> 
</group>     
</group> 
<group value="group2s1"> 
<group value="group2as1"> 
<prop value="group2Props">group2s1PropValues</prop> 
</group>     
</group> 
</subEnv> 
</env> 
<env value="testingA"> 
<subEnv value="env"> 
<group value="test2"> 
<group value="test2a"> 
<group value="test2ab"> 
<prop value="group2Props">testingAGroup2PropValues</prop> 
</group> 
</group>  
</group> 
</env> 
</config> 
</application-template> 

具有以下XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 

<xsl:param name="inputEnv"/> 
<xsl:variable name="env" select="/application-template/config/env[@value=$inputEnv]"/> 

<xsl:strip-space elements="*"/> 
<xsl:output method="text" indent="no"/> 

<xsl:template match="/"> 
<xsl:call-template name="ou"> 
<xsl:with-param name="subEnvPos" select="$env/subEnv"/> 
<xsl:with-param name="subEnvValue" select="$env/subEnv/@value"/> 
</xsl:call-template> 
</xsl:template> 

<xsl:template name="ou"> 
<xsl:param name="subEnvPos"/> 
<xsl:param name="subEnvValue"/> 

<xsl:variable name="test" select="/application-template/config/env[@value=$inputEnv]/subEnv[@value=$subEnvValue]"/> 

<xsl:for-each select="$test/group"> 
testing1:<xsl:value-of select="$test"/> 
</xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 

帕拉姆inputEnv是 「測試」 和帕拉姆$ subEnvValue是 「ENV」。我得到的輸出是

testing1:group2PropValues testing1:group2PropValues testing1:group2PropValues testing1:group2PropValues

但我想只是循環一次,因爲條件是要匹配subenv節點= $ subEnvValue(其是「env」)。我希望的輸出是

testing1:group2PropValues

回答

1

我認爲,代替目前的代碼

<xsl:template match="/"> 
    <xsl:call-template name="ou"> 
     <xsl:with-param name="subEnvPos" 
      select="$env/subEnv"/> 
     <xsl:with-param name="subEnvValue" 
      select="$env/subEnv/@value"/> 
    </xsl:call-template> 
</xsl:template> 

你想是這樣的

<xsl:template match="/"> 
    <xsl:call-template name="ou"> 
     <xsl:with-param name="subEnvPos" 
      select="$env/subEnv[1]"/> 
     <xsl:with-param name="subEnvValue" 
      select="$env/subEnv[1]/@value"/> 
    </xsl:call-template> 
</xsl:template> 

通過此修改,完整的XSLT代碼no w是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:param name="inputEnv" select="'testing'"/> 

    <xsl:variable name="env" select= 
    "/application-template/config/env[@value=$inputEnv]"/> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="text" indent="no"/> 

    <xsl:template match="/"> 
     <xsl:call-template name="ou"> 
      <xsl:with-param name="subEnvPos" 
       select="$env/subEnv[1]"/> 
      <xsl:with-param name="subEnvValue" 
       select="$env/subEnv[1]/@value"/> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="ou"> 
     <xsl:param name="subEnvPos"/> 
     <xsl:param name="subEnvValue"/> 
     <xsl:variable name="test" select= 
     "/application-template/config/env 
       [@value=$inputEnv]/subEnv[@value=$subEnvValue]"/> 
     <xsl:for-each select="$test/group"> 
testing1: 
      <xsl:value-of select="$test"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

和當施加到所提供的XML文檔:

<application-template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <config> 
     <env value="testing"> 
      <subEnv value="env"> 
       <group value="group2s"> 
        <group value="group2as"> 
         <group value="group2bs"> 
          <prop value="group2Props">group2PropValues</prop> 
         </group> 
        </group> 
       </group> 
      </subEnv> 
      <subEnv value="misc1"> 
       <group value="group2s"> 
        <group value="group2as"> 
         <group value="group2bs"> 
          <prop value="group2Props">group2sPropValues</prop> 
         </group> 
        </group> 
       </group> 
       <group value="group2s1"> 
        <group value="group2as1"> 
         <group value="group2bs1"> 
          <prop value="group2Props">group2s1PropValues</prop> 
         </group> 
        </group> 
       </group> 
      </subEnv> 
      <subEnv value="misc2"> 
       <group value="group2sMisc2"> 
        <group value="group2asMisc2"> 
         <group value="group2bsMisc2"> 
          <prop value="group2Props">group2PropValuesMisc2</prop> 
         </group> 
        </group> 
       </group> 
      </subEnv> 
     </env> 
    </config> 
</application-template> 

有用結果產生

testing1: 
      group2PropValues 

UPD吃

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 
<xsl:param name="vinputEnv" select="'testing'"/> 

<xsl:template match="/*/*/env"> 
    <xsl:if test="@value = $vinputEnv"> 
    <xsl:for-each select="descendant::*[not(*)]"> 
     <xsl:value-of select="concat('testing1: ', ., '&#xA;')"/> 
    </xsl:for-each> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉化應用到所提供的XML文檔(以上:

的OP在他想要的東西,這裏是一個短期和簡單的解決新的問題的註釋說明後),想要的,正確的結果產生

testing1: group2PropValues 
testing1: group2sPropValues 
testing1: group2s1PropValues 
testing1: group2PropValuesMisc2 
+0

@ user2387761,請*更新*的問題 - 這是很難理解此評論。 –

+0

對不起...我是一個新手在這裏,我試圖添加更多的代碼的意見,但我似乎無法正確格式化新的代碼。所以,我更新了原始的XML。我正在考慮進一步......即在之後,我喜歡回到ou模板來處理下一個。另外,我喜歡做的另一件事是給予「inputEnv」,它將處理由$ inputEnv指定的節點(由外部提供) – user2387761

+0

@ user2387761,如果你解釋得很好(在問題中)什麼是最好的正是你想從給定的XML文檔產生,以及轉換應該實現的規則/約束是什麼。我99%確定,一旦我們知道你想達到什麼目標,那麼就可以找到更短,更簡單,更優雅的解決方案。 –