2013-12-18 123 views
1

我遇到了XSLT 1.0問題。我試圖在StackOverflow上查找信息,但我無法應用這些示例。XSL交叉引用

這裏是我的XML的結構:

<XML> 
<PR> 
    <AS> 
     <ID_AS>AS-001</ID_AS> 
     <FIRST> 
      <ID_CATALOG>Id-001</ID_CATALOG> 
      <STATUS>NOK</STATUS> 
     </FIRST> 
     <SECOND> 
      <ID_CATALOG>Id-002</ID_CATALOG> 
      <STATUS>OK</STATUS> 
     </SECOND> 
    </AS> 
    <AS> 
     <ID_AS>AS-002</ID_AS> 
     <FIRST> 
      <ID_CATALOG>Id-003</ID_CATALOG> 
      <STATUS>OK</STATUS> 
     </FIRST> 
     <SECOND> 
      <ID_CATALOG>Id-004</ID_CATALOG> 
      <STATUS>OK</STATUS> 
     </SECOND> 
    </AS> 
</PR> 
<METADATA> 
    <ID_CATALOG>Id-001</ID_CATALOG> 
    <ANGLES>32.25</ANGLES> 
</METADATA> 
<METADATA> 
    <ID_CATALOG>Id-002</ID_CATALOG> 
    <ANGLES>18.75</ANGLES> 
</METADATA> 
<METADATA> 
    <ID_CATALOG>Id-003</ID_CATALOG> 
    <ANGLES>5.23</ANGLES> 
</METADATA> 
<METADATA> 
    <ID_CATALOG>Id-004</ID_CATALOG> 
    <ANGLES>12.41</ANGLES> 
</METADATA> 
</XML> 

我想顯示每個AS,第一/ ID_CATALOG,FIRST/STATUS和對應ID_CATALOG角度再秒/等。

輸出將類似於:

  • AS-001
    • 的Id-001 NOK 32.25
    • 的Id-002 OK 18.75
  • AS-002
    • Id-003 OK 5.23
    • 的Id-004 OK 12.41

我嘗試以下XSL但我只拿到角度的第一個項目

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns="http://earth.google.com/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:hma="http://earth.esa.int/hma" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink"> 
<xsl:output method="xml" indent="yes" encoding="ISO-8859-1"/> 
<!--==================MAIN==================--> 
<xsl:template match="/"> 
    <html> 
     <body> 
      AS List: 
      <br/><br/> 
      <xsl:call-template name="ASandCo"/> 
     </body> 
    </html> 
</xsl:template> 
<!--==================TEMPLATES==================--> 
<xsl:template name="ASandCo"> 
    <AS> 
     <xsl:for-each select="XML/PR/AS"> 
      <xsl:value-of select="ID_AS"/> 
      <br/> 
      <xsl:value-of select="FIRST/ID_CATALOG"/> - <xsl:value-of select="FIRST/STATUS"/> - 
       <xsl:if test="contains(/XML/METADATA/ID_CATALOG, FIRST/ID_CATALOG)"> 
        <xsl:value-of select="/XML/METADATA/ANGLES"/> 
       </xsl:if> 
      <br/> 
      <xsl:value-of select="SECOND/ID_CATALOG"/> - <xsl:value-of select="SECOND/STATUS"/> - 
       <xsl:if test="contains(/XML/METADATA/ID_CATALOG, SECOND/ID_CATALOG)"> 
        <xsl:value-of select="/XML/METADATA/ANGLES"/> 
       </xsl:if> 
      <br/><br/> 
     </xsl:for-each> 
    </AS> 
    </xsl:template> 
</xsl:stylesheet> 

這個XSLT將被應用到非常大的XML文件,所以我試圖找到最有效的方法。

非常感謝您提前!

+0

你有什麼麻煩?你能用你試過的XSLT更新你的問題嗎? –

+0

我想你需要一個Munechian分組。你有沒有嘗試過任何東西? – Peter

+0

你好傢伙,我已經更新了我的文章,包括我試圖解決的XSL。 –

回答

2

看來你想查找一些基於ID_CATALOG值的元數據元數據。

執行此操作的有效方法是使用key。您可以定義在頂層的一個關鍵:

<xsl:key name="metadata-by-id_catalog" match="METADATA" use="ID_CATALOG"/> 

然後你可以看一下使用給定的ID_CATALOG值這樣的關鍵角度值:

<xsl:value-of select="key('metadata-by-id_catalog', FIRST/ID_CATALOG)/ANGLES"/> 

這:

<xsl:value-of select="key('metadata-by-id_catalog', SECOND/ID_CATALOG)/ANGLES"/> 
+0

謝謝您的回覆!我用你的例子Jukka中描述的'key'函數,它工作。非常感謝你的幫助。 –