2012-05-23 3 views
1

У меня есть следующий XMLRestructure XML узлы, основанные на других узлах с использованием XSLT

<xml> 
    <object context="3-cumulative" > 
    <metadata> 
    <ref cite="4.2" relevance="first.2"/> 
    </metadata> 
<body> 
    <para> 
    <text> 
     applicable on and after December 14,2007. 
    </text> 
    </para> 
</body> 
</object> 
<object context="3-cumulative" > 
    <metadata> 
    <ref cite="4.2" relevance="first.1"/> 
    </metadata> 
<body> 
    <para> 
    <text> 
     applicable on and after December 14,2006. 
    </text> 
    </para> 
</body> 
</object> 

<object context="3-cumulative" > 
<metadata> 
    <related-content-ref cite="5 annuity" relevance="first.1"/> 
</metadata> 
<body> 
    <para> 
    <text> 
     applicable on and after December 14, 2008 
    </text> 
    </para> 
</body> 
</object> 
    <mainbody> 
     <num cite="4.2">4.2</num> 
     <heading>Stock exchanges</heading> 
     <prov-body> 
     <text> 
      Notwithstanding the provisions of a convention ... as defined in the 
      <italic>Income Tax Act</italic>. 
     </text> 
    <prov> 
      <num cite="5 annuity"/> 
      <heading>“annuity”</heading> 
      <text> 
      <term>“annuity”</term>does not include any pension payment ... 
      </text> 
      <text> 
      any pension payment ... 
      </text> 
    </prov> 
</prov-body> 
    </mainbody> 
</xml> 

Мне нужно увидеть, если какой-либо объект/метаданные/исх/@ цитируют было найдено в «mainbody» Num/@ процитировать то para/text from object должен копировать в конце первого текстового узла и должен сортироваться по объекту/метаданным/ref/@ релевантности.

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

<xml> 
<mainbody> 
<num cite="4.2">4.2</num> 
<heading>Stock exchanges</heading> 
<prov-body> 
    <text> 
    Notwithstanding the provisions of a convention ... as defined in the 
    <italic>Income Tax Act</italic>. 
    **applicable on and after December 14, 2006** 
    **applicable on and after December 14, 2007** 
    </text> 
<prov> 
     <num cite="5 annuity"/> 
     <heading>“annuity”</heading> 
     <text> 
     <term>“annuity”</term>does not include any pension payment ... 
     **applicable on and after December 14, 2008** 
     </text> 
     <text> 
     any pension payment ... 
     </text> 
    </prov> 
    </prov-body> 
</mainbody> 
</xml> 
+0

Что вы ждете? сообщите нам, когда у вас возникнут проблемы! – mindandmedia

+0

Я просто хочу знать, как запустить его, я использую ключ для получения цитат из объекта/метаданных/ref/@ cite, как мне соответствовать текст emlment? Мне нужен первый текстовый элемент для каждого набора, где у нас есть соответствующий цит. – atif

+0

Ваш образец «ожидаемого выхода» не является корректным. Пожалуйста исправьте. не является допустимым именем элемента, и даже если бы это было так, то к этому стартовому тегу не будет соответствовать соответствующий тег окончания. –

ответ

2

Это XSLT 1.0 Преобразование (тот же результат получается, если атрибут version изменяется на 2,0 и преобразование выполняется с процессором XSLT 2.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:key name="kRefByCite" 
     match="metadata/*" use="@cite" /> 

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

<xsl:template match= 
    "text[(preceding::text[1]|preceding::num[1]) 
      [last()] 
       [key('kRefByCite', @cite)]]"> 
    <text> 
    <xsl:apply-templates/> 
    <xsl:for-each select= 
     "key('kRefByCite', preceding::num[1]/@cite)"> 
     <xsl:sort select="@relevance"/> 

     <xsl:value-of select="../../body/para/text"/> 
    </xsl:for-each> 
    </text> 
</xsl:template> 
<xsl:template match= 
    "node() 
    [parent::* and not(ancestor-or-self::mainbody)]"/> 
</xsl:stylesheet> 

при нанесении на предоставленном документе XML:

<xml> 
    <object context="3-cumulative" > 
     <metadata> 
      <ref cite="4.2" relevance="first.2"/> 
     </metadata> 
     <body> 
      <para> 
       <text> 
      applicable on and after December 14,2007. 
       </text> 
      </para> 
     </body> 
    </object> 
    <object context="3-cumulative" > 
     <metadata> 
      <ref cite="4.2" relevance="first.1"/> 
     </metadata> 
     <body> 
      <para> 
       <text> 
      applicable on and after December 14,2006. 
       </text> 
      </para> 
     </body> 
    </object> 
    <object context="3-cumulative" > 
     <metadata> 
      <related-content-ref cite="5 annuity" relevance="first.1"/> 
     </metadata> 
     <body> 
      <para> 
       <text> 
      applicable on and after December 14, 2008 
       </text> 
      </para> 
     </body> 
    </object> 
    <mainbody> 
     <num cite="4.2">4.2</num> 
     <heading>Stock exchanges</heading> 
     <prov-body> 
      <text> 
     Notwithstanding the provisions of a convention ... as defined in the 
       <italic>Income Tax Act</italic>. 
      </text> 
      <prov> 
       <num cite="5 annuity"/> 
       <heading>“annuity”</heading> 
       <text> 
        <term>“annuity”</term>does not include any pension payment ... 
       </text> 
       <text> 
      any pension payment ... 
       </text> 
      </prov> 
     </prov-body> 
    </mainbody> 
</xml> 

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

<xml> 
    <mainbody> 
     <num cite="4.2">4.2</num> 
     <heading>Stock exchanges</heading> 
     <prov-body> 
     <text> 
     Notwithstanding the provisions of a convention ... as defined in the 
       <italic>Income Tax Act</italic>. 

      applicable on and after December 14,2006. 

      applicable on and after December 14,2007. 
       </text> 
     <prov> 
      <num cite="5 annuity"/> 
      <heading>“annuity”</heading> 
      <text> 
       <term>“annuity”</term>does not include any pension payment ... 

      applicable on and after December 14, 2008 
       </text> 
      <text> 
      any pension payment ... 
       </text> 
     </prov> 
     </prov-body> 
    </mainbody> 
</xml> 

Пояснения:

Соответствующие первостепенные из identity rule и их использование xsl:key и функции key().

+0

Вау ... Спасибо большое. Он работал как charme, только модифицированный до . Просто нужен дополнительный stuuf на основе типа контекста, который хочет вставлять значения до и после текстового элемента. поэтому, если type = "3-кумулятивный", то он должен выглядеть как указано выше. Если type = "1-cummlative", то вместо того, чтобы вступать в текст, я хочу, чтобы он был до , и если он 2-коммулятивный, тогда вставьте после. – atif

+0

Я попытался сделать так: но не является результатом желания ... любая мысль Dimitre ? – atif

+0

@atif: Ваш оригинальный вопрос полностью отвечает. Могут быть бесконечные «маленькие» модификации исходного вопроса, и было бы неверно добавлять их в качестве незначительных изменений в вопросе. Пожалуйста, хорошо подумайте, что именно нужно, и задайте новый вопрос. Ночь здесь, поэтому я буду рад завтра утром взглянуть на любой новый вопрос, который вы могли бы разместить. –

Смежные вопросы