2013-04-11 80 views
0

我幾乎已經解決了這個問題,然後發現coverage-ref屬於相應coverage元素中的關鍵屬性。如何通過XSL使用密鑰調用模板

的XPath看起來像

/消息/人,信息/要求列表/要求/

<coverage-ref>4</coverage-ref> 

/消息/人,信息/覆蓋列表/

<coverage key="4" id="23" > 
... 
</coverage> 

目前XSL的片段

<xsl:template match="claim" mode="fact"> 
    <ClaimFact> 
     <coverage> 
       <xsl:choose> 
        <xsl:when test="./coverage-ref"> 
        <!-- 
        COVERAGE-<xsl:value-of select="util:ifNull(./coverage-ref, '0')"/> 
        --> 
         <xsl:call-template name="coverage-ref"> 
          <xsl:with-param name="coverage-ref" select="./coverage-ref" /> 
         </xsl:call-template> 
        </xsl:when> 
        <xsl:when test="./../../../coverage/@id">COVERAGE-<xsl:value-of select="./../../../coverage/@id"/></xsl:when>      
        <xsl:otherwise><xsl:text>UNKNOWNCOVERAGE</xsl:text></xsl:otherwise> 
       </xsl:choose> 
     </coverage>  
    </ClaimFact> 
</xsl:template> 

<xsl:template match="coverage|coverage-ref" > 
<xsl:param name="coverage-ref" /> 
<xsl:variable name="coverage" 
     select="/person-info/coverage-list/coverage[@key = $coverage-ref]" /> 
    <CoverageDimension> 
     <mycoverageref><xsl:value-of select="$coverage" /></mycoverageref> 
... 

    </CoverageDimension> 
</xsl:template> 

錯誤我得到

Error at xsl:call-template on line 1845 column 51 of personinfo.xsl: 
    XTSE0650: No template exists named coverage-ref 

現有的註釋掉會把覆蓋-REF到mycoverageref。

我想用xsl:call-template,xsl:param和xsl:variable做的事情是:1)將mycoverageref設置爲元素的@id而不是@key。

2)更好的辦法是將值4替換爲23,現有的應用模板應該在CoverageDimension上工作。

在此先感謝!

回答

2

您正試圖調用命名模板「模板參考」

<xsl:call-template name="coverage-ref"> 
    <xsl:with-param name="coverage-ref" select="./coverage-ref" /> 
</xsl:call-template> 

但在你的XSLT沒有這樣的模板。你只需要匹配一個覆蓋-REF元素

<xsl:template match="coverage|coverage-ref"> 

釋是不一樣的東西命名模板的模板。

很可能你的意思是做到這一點...

<xsl:template match="coverage" name="coverage-ref"> 

這將是雙方的匹配模板,並命名模板。或者,你可以改變你原來的的xsl:調用模板XSL:申請模板這裏

<xsl:apply-template select="coverage-ref"> 
    <xsl:with-param name="coverage-ref" select="./coverage-ref" /> 
</xsl:apply-templates> 

你不會真的需要傳遞參數在此雖然。匹配模板可以直接獲取元素的值。

<xsl:template match="coverage-ref" > 
    <xsl:variable name="coverage" select="/person-info/coverage-list/coverage[@key = .]" /> 

但無論如何,你談論'鑰匙',但你實際上並沒有使用'正確的'鍵。特別是xsl:密鑰。這就是你在這種情況下需要的東西。你想查詢覆蓋範圍元素由他們的屬性?然後,只需定義,像這樣

<xsl:key name="coverageLookup" match="coverage" use="@key" /> 

然後一鍵查找的範圍元素,只是這樣做:

<xsl:value-of select="key('coverageLookup', $coverage-ref)/@id" /> 

或者,如果你使用的是匹配的模板,它看起來像這樣

<xsl:template match="coverage-ref" > 
    <CoverageDimension> 
     <mycoverageref><xsl:value-of select="key('coverageLookup', .)/@id" /></mycoverageref> 
     ... 
    </CoverageDimension> 
</xsl:template> 
+0

我用你的解決方案的一部分,並會發布我在答案中做了什麼。當前的xsl沒有定義鍵或keylookups。我們可能想要爲未來的版本走這條路線,但這需要對現有的xsl進行整個重寫。 – iowatiger08 2013-04-12 15:05:56

0

這是我做的,非常感謝@ Tim-C。我們將不得不考慮未來版本的keyLookups,但這適用於當前的xml。使用變量$coverpath來匹配coverage/@keycoverage-ref/text()值使得這項工作。

<xsl:stylesheet version="20" 
... 
<xsl:template match="person-info"> 
    <PersonDimension> 
    ... 
    </PersonDimension> 
    <xsl:apply-templates select="coverage-list/coverage" />   
    <xsl:apply-templates select="//claim-list/claim" mode="fact" /> 
</xsl:template> 

<xsl:template match="claim" mode="fact"> 
    <xsl:variable name="coveragepath" 
     select="/message/person-info/coverage-list/coverage[@key = current()/coverage-ref/text()]" /> 

    <ClaimFact> 
... 
     <coverage> 
       <xsl:choose> 
        <xsl:when test="$coveragepath/@id">      
         COVERAGE-<xsl:value-of select="$coveragepath/@id"/> 
        </xsl:when> 
        <xsl:when test="./../../../coverage/@id">COVERAGE-<xsl:value-of select="./../../../coverage/@id"/></xsl:when>      
        <xsl:otherwise>UNKNOWNCOVERAGE</xsl:otherwise> 
       </xsl:choose> 
     </coverage> 
    </ClaimFact> 

</xsl:template> 

<xsl:template match="coverage" > 
<CoverageDimension> 
     <jaxbId> 
     <xsl:choose> 
      <xsl:when test="@id">COVERAGE-<xsl:value-of select="@id"/></xsl:when> 
      <xsl:otherwise>UNKNOWNCOVERAGE</xsl:otherwise> 
     </xsl:choose> 
     </jaxbId> 
    </CoverageDimension> 
</xsl:template>