Xslt XSL交叉引用

Xslt XSL交叉引用,xslt,xslt-1.0,Xslt,Xslt 1.0,我遇到了XSLT1.0问题。我试图找到有关StackOverflow的信息,但无法应用示例 以下是我的XML的结构: <XML> <PR> <AS> <ID_AS>AS-001</ID_AS> <FIRST> <ID_CATALOG>Id-001</ID_CATALOG> <STATUS>NOK<

我遇到了XSLT1.0问题。我试图找到有关StackOverflow的信息,但无法应用示例

以下是我的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-001
Id-001
诺克
Id-002
好啊
AS-002
Id-003
好啊
Id-004
好啊
Id-001
32.25
Id-002
18.75
Id-003
5.23
Id-004
12.41
我想为每个AS显示第一个/ID_目录、第一个/ID_目录对应的状态和角度,然后是第二个/etc

输出类似于:

  • AS-001
    • Id-001编号32.25
    • Id-002正常18.75
  • AS-002
    • Id-003正常5.23
    • Id-004正常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文件,因此我正在尝试找到最有效的方法


提前非常感谢

您似乎希望根据ID\u目录值查找一些元数据

一种有效的方法是使用。可以在顶层定义关键点:

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

然后可以使用给定ID_目录值的键查找角度值,如下所示:

<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"/>


您遇到了什么问题?你能用你尝试过的XSLT更新你的问题吗?我想你需要一个Munechian分组。你们试过什么了吗?大家好,我已经更新了我的帖子,加入了我正在尝试的XSL。你们需要阅读
XSL:key
元素和key()函数谢谢你们的回复!我使用了您的示例Jukka中描述的“key”函数,它成功了。非常感谢你的帮助。