Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT 1.0:键在选择节点时不起作用_Xslt_Key_Xslt 1.0 - Fatal编程技术网

XSLT 1.0:键在选择节点时不起作用

XSLT 1.0:键在选择节点时不起作用,xslt,key,xslt-1.0,Xslt,Key,Xslt 1.0,我有一个提供当前输出的XML和XSLT。它使用一个“键”,但我没有得到预期的输出 源XML: <?xml version="1.0" encoding="UTF-8"?> <Root> <Receivers> <ReceiverRule> <Condition> <Value>Condition 1<

我有一个提供当前输出的XML和XSLT。它使用一个“键”,但我没有得到预期的输出

源XML:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Receivers>
        <ReceiverRule>
            <Condition>
                <Value>Condition 1</Value>
            </Condition>
            <Receiver>
                <party>party1</party>
                <system>SYS1</system>
            </Receiver>
        </ReceiverRule>
        <ReceiverRule>
            <Condition>
                <Value>Condition 2</Value>
            </Condition>
            <Receiver>
                <party>party2</party>
                <system>SYS2</system>
            </Receiver>
        </ReceiverRule>
    </Receivers>
    <ReceiverInterfaces>
        <Receiver>
            <party>party1</party>
            <system>SYS1</system>
        </Receiver>
        <ReceiverInterfaceRule>
            <Rule>Rule 1 sytem 1</Rule>
        </ReceiverInterfaceRule>
        <ReceiverInterfaceRule>
            <Rule>Rule 2 system 1</Rule>
        </ReceiverInterfaceRule>
    </ReceiverInterfaces>
    <ReceiverInterfaces>
        <Receiver>
            <party>party2</party>
            <system>SYS2</system>
        </Receiver>
        <ReceiverInterfaceRule>
            <Rule>Rule 1 system 2</Rule>
        </ReceiverInterfaceRule>
        <ReceiverInterfaceRule>
            <Rule>Rule 2 system 2</Rule>
        </ReceiverInterfaceRule>
    </ReceiverInterfaces>
</Root>

条件1
第1方
系统1
条件2
第2部分
系统2
第1方
系统1
规则1系统1
规则2制度1
第2部分
系统2
规则1制度2
规则2系统2
我的XSLT:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes"/>
    
    <xsl:key name="Receiver" match="ReceiverRule/Receiver" use="concat(party,system)"/>
    
    <xsl:template match="Root">
        <ReceiverList>
            <xsl:apply-templates select="Receivers/ReceiverRule"/>
        </ReceiverList>
    </xsl:template>
    
    <xsl:template match="ReceiverRule">
        <Receiver>
            <Name>
                <xsl:value-of select="concat(Receiver/party, ' ' ,Receiver/system)"/>
            </Name>
            <Condition>
                <xsl:value-of select="Condition/Value"/>
            </Condition>
            
            <xsl:apply-templates select="ancestor::Root/ReceiverInterfaces
                [Receiver/child::* = key('Receiver',Root/Receivers/ReceiverRule/Receiver)]"/>
        
        </Receiver>
        
    </xsl:template>
    
    <xsl:template match="ReceiverInterfaces">
        <xsl:apply-templates select="ReceiverInterfaceRule"/>
    </xsl:template>
    
    <xsl:template match="ReceiverInterfaceRule">
        <Rule>
            <xsl:value-of select="Rule"/>
        </Rule>
    </xsl:template>
    
</xsl:stylesheet>

生成此XML输出:

<?xml version="1.0" encoding="UTF-8"?>
<ReceiverList>
    <Receiver>
        <Name>party1 SYS1</Name>
        <Condition>Condition 1</Condition>
    </Receiver>
    <Receiver>
        <Name>party2 SYS2</Name>
        <Condition>Condition 2</Condition>
    </Receiver>
</ReceiverList>

第1部分系统1
条件1
第2部分系统2
条件2
但我期待这一结果:

<?xml version="1.0" encoding="UTF-8"?>
<ReceiverList>
    <Receiver>
        <Name>party1 SYS1</Name>
        <Condition>Condition 1</Condition>
        <Rule>Rule 1 sytem 1</Rule>
        <Rule>Rule 2 system 1</Rule>
    </Receiver>
    <Receiver>
        <Name>party2 SYS2</Name>
        <Condition>Condition 2</Condition>
        <Rule>Rule 1 system 2</Rule>
        <Rule>Rule 2 system 2</Rule>
    </Receiver>
</ReceiverList>

第1部分系统1
条件1
规则1系统1
规则2制度1
第2部分系统2
条件2
规则1制度2
规则2系统2
不知怎的,我的钥匙不认识。我很感激任何关于我做错了什么的暗示。 非常感谢。 彼得

我认为他不是

<xsl:apply-templates select="ancestor::Root/ReceiverInterfaces
            [Receiver/child::* = key('Receiver',Root/Receivers/ReceiverRule/Receiver)]"/>

你想要的只是

<xsl:apply-templates select="key('Receiver', concat(Receiver/party, Receiver/system))/ReceiverInterfaceRule"/>

用钥匙

<xsl:key name="Receiver" match="ReceiverInterfaces" use="concat(Receiver/party, Receiver/system)"/>

Martin,谢谢!我很挣扎,但在你的“编辑”后,它工作正常。说到“钥匙”,我总是迷路。你的个人资料令人印象深刻!向你问好,彼得