XSLT 中缺少后代节点

Missing descendant node from XSLT

根据 http://xsltfiddle.liberty-development.net/jxNakA5/1,我在输出中缺少以下后代节点:

<test-child>123</test-child>

知道这里有什么问题吗?

来源XML

?xml version="1.0" encoding="UTF-8"?>
<library>
    <content content-id="a">
        <test>
            <test-child>123</test-child>
        </test>        
        <data xml:lang="x-default">{"product" : 123 }</data>    
        <content-links>
            <content-link content-id="a1"/>
            <content-link content-id="a2"/>
        </content-links>
    </content>
    <content content-id="b">
        <data xml:lang="x-default">{"product" : 123 }</data>
        <content-links>
            <content-link content-id="b1"/>
            <content-link content-id="b2"/>
        </content-links>
    </content>
    <content content-id="a1">
        <data xml:lang="x-default">{"product" : 123 }</data>
        <content-links>
            <content-link content-id="a11"/>
            <content-link content-id="a12"/>
        </content-links>
    </content>
    <content content-id="a2">
        <data xml:lang="x-default">{"product" : 123 }</data>
        <content-links>
            <content-link content-id="a21"/>
            <content-link content-id="a22"/>
        </content-links>
    </content>
    <content content-id="a11">
        <data xml:lang="x-default">{"product" : 123 }</data>
    </content>
    <content content-id="a12"/>
    <content content-id="a21">
        <data xml:lang="x-default">{"product" : 123 }</data>
    </content>
</library>

XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mf="http://example.com/mf"
    
    exclude-result-prefixes="#all"
    version="3.0">
    
    <xsl:function name="mf:get-related-elements" as="element()*">
        <xsl:param name="element" as="element()"/>
        <xsl:sequence
            select="$element ! (. | * | key('ref', content-links/content-link/@content-id)/mf:get-related-elements(.))"/>
    </xsl:function>
    
    <xsl:key name="ref" match="/*//*" use="@content-id"/>
    
    <xsl:param name="cid" select="'a'" />
    
    <xsl:variable name="start" select="key('ref', $cid)"/>
    <xsl:variable name="related-elements" select="mf:get-related-elements($start)"/>
    
    <xsl:mode on-no-match="shallow-copy"/>
    
    <xsl:template match="/*//*[not(. intersect $related-elements)]"/>
    
</xsl:stylesheet>

看是否使用

<xsl:sequence
            select="$element ! (. | .//* | key('ref', content-links/content-link/@content-id)/mf:get-related-elements(.))"/>

满足您的最新要求。

但是很难判断每次添加需求时修补的原始方法是否是正确的方法,除非您开始用一些句子描述要复制而不是将节点复制到输出的标准.

嗯,很清楚为什么它没有被复制:它不是“相关元素”。

我不知道你想要达到什么目的(你没有告诉我们),但是你的代码将 children 视为相关的,而不是更深层次的后代。该函数递归地遵循@content-id 的关系,但在选择提供的元素的children 时不会递归,因此仅选择了first-level children。