我需要一些有关 XSLT 的帮助来检查每个<Info>
带有@Type="bar"
.
如果它们的子<Ref>
元素都包含在子<Ref>
元素中的<Info>
元素with中@Type="foo"
,我想要一个<Info>
与@Type="foo"
在目标中创建的同一个<Refs>
。
我为 XSLT 中缺少动态 updatebale 变量而苦苦挣扎!
请参阅下面的来源和预期目标
来源
<?xml version="1.0" encoding="UTF-8"?>
<Infos>
<Info Type="foo">
<Refs>
<Ref>1</Ref>
<Ref>2</Ref>
<Ref>3</Ref>
</Refs>
<Content>FOO CONTENT</Content>
</Info>
<Info Type="bar">
<Refs>
<Ref>1</Ref>
<Ref>2</Ref>
</Refs>
<Content>BAR 1 CONTENT</Content>
</Info>
<Info Type="bar">
<Refs>
<Ref>3</Ref>
</Refs>
<Content>BAR 2 CONTENT</Content>
</Info>
<Info Type="bar">
<Refs>
<Ref>4</Ref>
</Refs>
<Content>BAR 3 CONTENT</Content>
</Info>
</Infos>
预期目标
<?xml version="1.0" encoding="UTF-8"?>
<Infos>
<Info Type="foo">
<Refs>
<Ref>1</Ref>
<Ref>2</Ref>
</Refs>
<Content>FOO CONTENT</Content>
</Info>
<Info Type="foo">
<Refs>
<Ref>3</Ref>
</Refs>
<Content>FOO CONTENT</Content>
</Info>
<Info Type="bar">
<Refs>
<Ref>1</Ref>
<Ref>2</Ref>
</Refs>
<Content>BAR 1 CONTENT</Content>
</Info>
<Info Type="bar">
<Refs>
<Ref>3</Ref>
</Refs>
<Content>BAR 2 CONTENT</Content
</Info>
<Info Type="bar">
<Refs>
<Ref>4</Ref>
</Refs>
<Content>BAR 3 CONTENT</Content
</Info>
</Infos>
因此,请注意创建的两个 foo 元素,因为原始元素的引用为 1,2,3,其中一个 bar 为 1,2,一个 bar 为 3。
此外,原始 bar 元素完全按照 source 进行映射。
如果我理解正确(这完全不确定),你想做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="foo" match="Info[@Type='foo']" use="Refs/Ref" />
<xsl:template match="/Infos">
<xsl:copy>
<xsl:apply-templates select="Info[@Type='bar'][key('foo', Refs/Ref)]" mode="foo"/>
<xsl:copy-of select="Info[@Type='bar']"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Info" mode="foo">
<Info Type="foo">
<xsl:copy-of select="Refs"/>
<xsl:copy-of select="key('foo', Refs/Ref)/*[not(self::Refs)]"/>
</Info>
</xsl:template>
</xsl:stylesheet>
基本上,这会获取bar
与 下列出的引用之一匹配的所有节点,将foo
它们重新创建为foo
节点并从匹配foo
节点复制内容。然后它按原样复制所有bar
节点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句