2017-06-21 79 views
0

我需要一些XSLT帮助来检查每个源<Info>元素与@Type="bar"XSLT在映射之前检查内容

如果他们的孩子<Ref>元素在孩子包含的<Info>元素<Ref>元素与@Type="foo", 我想与目标具有相同<Refs>创建@Type="foo"一个<Info>

我在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> 

所以注意作为原始创建了两个富元素有裁判1,2

查看源和预期目标, 3,并有一个酒吧1,2和一个酒吧与3.

此外,原始条形图元素完全按照来源映射。

+0

所需的逻辑根本不清楚。 ''出现在'foo'和'bar'下面;为什么要区别对待? –

+0

我更新了目标,使其具有与源代码相同的顺序,这是您引用的区别吗? – CCoy

回答

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节点,并复制匹配的foo节点中的内容。然后它复制所有bar节点,如

+0

不完全是节点可能有更多的独特内容,所以创建的节点必须基于原始foo节点 – CCoy

+0

更新了源和目标以反映上述评论 – CCoy

+0

@CCoy您可以使用相同的密钥复制额外的内容。 –