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。
根据 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。