XSLT在映射之前检查内容

时间:2017-06-21 09:28:47

标签: xslt xslt-1.0

我需要一些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.

原始的条形元素也完全根据来源进行映射。

1 个答案:

答案 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个节点