2012-04-20 2 views
1

Я пытаюсь сделать следующее в XSLT 1.0:для каждого в каждой логики

Копирование всех элементов Фрам как в выходной, когда условие является любой из атрибутов FRAM (в @name И @type И @ref) совпадает с любым элементом XFram, тогда он должен обновить Fram/text() с помощью XFram/text(). После этого копия остатка элемента XFram (все эти dint соответствуют указанным выше критериям) и преобразует их в тег Fram.

Примечание: атрибут Third Fram element соответствует третьему элементу Xfram, поэтому текст добавляется в третий элемент Fram. Остальная часть элемента XFarm превратилась в элемент Fram и добавлена ​​после последнего элемента Fram. Также вы заметите, что порядок Фрая не изменяется.

Input.xml

<Doc>AL 
<Frams> 
<Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram> 
<Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram> 
<Fram type="z" name="Fram3" ref="ref3">This is Fram Three</Fram> 
<Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram> 
<Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram> 
</Frams> 
<XFram> 
<XFram type="e" name="XFram1" ref="Xref1">This is XFram One</Fram> 
<XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</Fram> 
<XFram type="z" name="XFram3" ref="Xref3">This is XFram Three</Fram> 
<XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</Fram> 
<XFram> 
<Doc> 

Вывод должен быть:

<Doc> 
<Frams> 
<Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram> 
<Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram> 
<Fram type="z" name="Fram3" ref="ref3">This is XFram Three</Fram> 
<Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram> 
<Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram> 
<XFram type="e" name="XFram1" ref="Xref1">This is XFram One</Fram> 
<XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</Fram> 
<XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</Fram> 
</Frams> 
<Doc> 

Я делаю что-то подобное, но не в состоянии думать о логике:

<xsl:template match="/"> 
    <xsl:for-each select="XFram"> 
     <xsl:variable name="type"> 
      <xsl:value-of select="type"/> 
     </xsl:variable> 
     <xsl:variable name="name"> 
      <xsl:value-of select="name"/> 
     </xsl:variable> 
     <xsl:variable name="ref"> 
      <xsl:value-of select="ref"/> 
     </xsl:variable> 
     <xsl:for-each select="//Fram"> 
      <xsl:choose> 
       <xsl:when test="(type = $type) and (name = $name) and (ref = $ref)"> </xsl:when> 
      </xsl:choose> 
     </xsl:for-each>   
    </xsl:for-each> 
</xsl:template> 

ответ

0

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Fram[last()]"> 
    <xsl:call-template name="identity"/> 

    <xsl:apply-templates 
     select="../../XFram/*"/> 
</xsl:template> 

<xsl:template match="XFram/XFram"> 
    <xsl:if test= 
    "not(/*/Frams/* 
      [@type = current()/@type 
      and 
       concat('X',@name) = current()/@name 
      and 
       concat('X',@ref) = current()/@ref 
      ] 
     )"> 
    <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 
<xsl:template match="XFram"/> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML (с исправленной тяжелой malformedness !!!):

<Doc> 
    <Frams> 
     <Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram> 
     <Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram> 
     <Fram type="z" name="Fram3" ref="ref3">This is Fram Three</Fram> 
     <Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram> 
     <Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram> 
    </Frams> 
    <XFram> 
     <XFram type="e" name="XFram1" ref="Xref1">This is XFram One</XFram> 
     <XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</XFram> 
     <XFram type="z" name="XFram3" ref="Xref3">This is XFram Three</XFram> 
     <XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</XFram></XFram> 
</Doc> 

производит разыскиваемый, правильный результат:

<Doc> 
    <Frams> 
     <Fram type="x" name="Fram1" ref="ref1">This is Fram One</Fram> 
     <Fram type="y" name="Fram2" ref="ref2">This is Fram Two</Fram> 
     <Fram type="z" name="Fram3" ref="ref3">This is Fram Three</Fram> 
     <Fram type="a" name="Fram4" ref="ref3">This is Fram Four</Fram> 
     <Fram type="b" name="Fram5" ref="ref3">This is Fram Five</Fram> 
     <XFram type="e" name="XFram1" ref="Xref1">This is XFram One</XFram> 
     <XFram type="f" name="XFram2" ref="Xref2">This is XFram Two</XFram> 
     <XFram type="e" name="XFram1" ref="Xref1">This is XFram Four</XFram> 
    </Frams> 
</Doc>