我需要一些XSLT帮助,以<Info>
检查每个源@Type="bar"
元素。
如果他们的子<Ref>
个元素包含在<Ref>
元素的<Info>
元素中@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并且有一个条形图1,2和一个条形条形图3.
原始的条形元素也完全根据来源进行映射。
答案 0 :(得分:0)
如果我理解正确(这完全不确定),你想做:
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
个节点,并从匹配的{{1}复制内容节点。然后它按原样复制所有foo
个节点。