2017-06-21 106 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您可以使用相同的密鑰複製額外的內容。 –