Xml XSL-替换同名节点';不同价值观的价值观

Xml XSL-替换同名节点';不同价值观的价值观,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我试图根据节点(D)的值与规则/项中的值的匹配情况,用相同的名称替换不同结构(Body/C和Body/E)中的节点(D)。也许每个人都有一个类似的名字 我用了两个键,一个是新值,另一个是旧值(可能没用),然后我对每个键都做了修改,但是有新值的键没有给我任何东西。难道这不管用吗 另一个问题是,我想复制匹配节点的父节点,我的XSLT也将“项”加倍 输入, <Message> <XMLNSC> <Translator> <Rule>

我试图根据节点(D)的值与规则/项中的值的匹配情况,用相同的名称替换不同结构(Body/C和Body/E)中的节点(D)。也许每个人都有一个类似的名字

我用了两个键,一个是新值,另一个是旧值(可能没用),然后我对每个键都做了修改,但是有新值的键没有给我任何东西。难道这不管用吗

另一个问题是,我想复制匹配节点的父节点,我的XSLT也将“项”加倍

输入,

<Message>
<XMLNSC>
    <Translator>
        <Rule>
            <Item>
                <D>RuleD1</D>
                <New>RuleD1</New> <!-- I guess I don't need an element for this -->
                <Original>valD1</Original>
            </Item>
            <Item>
                <D>RuleD2</D>
                <New>RuleD2</New> <!-- I guess I don't need an element for this -->
                <Original>valD2</Original>
            </Item>
        </Rule>
        <Body>
            <A>valA</A>
            <B>valB</B>
            <C>
                <D>valD1</D>
            </C>
            <E>
                <D>valD2</D>
            </E>
        </Body>
    </Translator>
</XMLNSC>

规则1
规则1
瓦尔1
规则2
规则2
瓦尔德2

因为您的XSLT样式表很复杂,我不知道什么是重要的,所以我尝试尽可能少地更改,以实现您想要的结果

  • 我将您的第二个
    xsl:key
    更改为

    <xsl:key name="ref_origin"  match="Item" use="Original"/>
    
  • 我在最后一个
    xsl:for each
    中添加了另一个元素,以添加从上述
    xsl:key
    访问的
    D
    元素

    <xsl:for-each select="key('ref_origin', text())">
        <xsl:element name="{$fieldName}">
            <xsl:value-of select="D"/>       <!-- Using the D child of the Item from the key -->
        </xsl:element>
        <xsl:element name="{$fieldName}_Agg">
            <xsl:value-of select="$fieldValue"/>
        </xsl:element>
    </xsl:for-each>
    
    
    
  • 现在输出应该如预期的那样

    <xsl:key name="ref_origin"  match="Item" use="Original"/>
    
    <!-- duplicate matched node's parent -->
    <xsl:template match="Translator//*[not(self::Rule)][*[key('ref', concat(generate-id(ancestor::Translator), '|', name()))]]">
        <xsl:call-template name="identity" />
        <xsl:if test="not(self::Item)">
            <xsl:call-template name="identity" />
        </xsl:if>
    </xsl:template>
    
    <xsl:for-each select="key('ref_origin', text())">
        <xsl:element name="{$fieldName}">
            <xsl:value-of select="D"/>       <!-- Using the D child of the Item from the key -->
        </xsl:element>
        <xsl:element name="{$fieldName}_Agg">
            <xsl:value-of select="$fieldValue"/>
        </xsl:element>
    </xsl:for-each>