2017-02-02 2 views
0

У меня есть этот псевдо-XML:XSL скопировать узел, если определенное условие соответствует

<?xml version="1.0" encoding="UTF-8"?> 
<comtec version="2010"> 
<query name="rgh/TestNTV/ABC"> 
    <vars> 
     <parameter name="ids">1,2,3,4</parameter> 
    </vars> 
    <err/> 
    <Results> 
     <record id="1"> 
      <column name="id_task">1</column> 
      <column name="capabilityCode">FR1</column> 
      <column name="ColMiss">miss</column> 
      <column name="ColHave"/> 
     </record> 
     <record id="2"> 
      <column name="id_task">1</column> 
      <column name="capabilityCode">FR2</column> 
      <column name="ColMiss"/> 
      <column name="ColHave">notmiss</column> 
     </record> 
     <record id="3"> 
      <column name="id_task">2</column> 
      <column name="capabilityCode">D2</column> 
      <column name="ColMiss">miss</column> 
      <column name="ColHave"/> 
     </record> 
     <record id="4"> 
      <column name="id_task">2</column> 
      <column name="capabilityCode">F3</column> 
      <column name="ColMiss">miss</column> 
      <column name="ColHave"/> 
     </record> 
     <record id="5"> 
      <column name="id_task">3</column> 
      <column name="capabilityCode">SD21</column> 
      <column name="ColMiss"/> 
      <column name="ColHave">notmiss</column> 
     </record> 
     <record id="6"> 
      <column name="id_task">4</column> 
      <column name="capabilityCode">XXX</column> 
      <column name="ColMiss">miss</column> 
      <column name="ColHave"/> 
     </record> 
    </Results> 
</query> 
</comtec> 

Желаемый результат:

<Results> 
<record id="1"> 
    <column name="id_task">1</column> 
    <column name="capabilityCode">FR1</column> 
    <column name="ColMiss">miss</column> 
    <column name="ColHave"/> 
</record> 
<record id="2"> 
    <column name="id_task">1</column> 
    <column name="capabilityCode">FR2</column> 
    <column name="ColMiss"/> 
    <column name="ColHave">notmiss</column> 
</record> 
<record id="3"> 
    <column name="id_task">2</column> 
    <column name="capabilityCode">D2</column> 
    <column name="ColMiss">miss</column> 
    <column name="ColHave"/> 
</record> 
<record id="4"> 
    <column name="id_task">2</column> 
    <column name="capabilityCode">F3</column> 
    <column name="ColMiss">miss</column> 
    <column name="ColHave"/> 
</record> 
<record id="6"> 
    <column name="id_task">4</column> 
    <column name="capabilityCode">XXX</column> 
    <column name="ColMiss">miss</column> 
    <column name="ColHave"/> 
</record> 
</Results> 

В основном я хочу, чтобы скопировать все «записи» тег для каждого идентификатора, который имеет «ColMiss» NOT NULL или комбинацию («ColMiss» не null и «ColHave» не равно null). Точнее, если моя id_task перезаписывается (как в примере), и у нее есть 2 записи, один с «ColMiss» не является нулевым, а другая запись с CollMiss null, но с ColHave not null я хочу скопировать обе «записи» для информации. If У меня есть задача, которая имеет только «ColMiss» не null, тогда я хочу скопировать все записи этого . Если у меня есть задача, которая имеет только «ColHave» null, то я не хочу эту информацию.

Иными словами , если идентификатор имеет «пропущен», то скопируйте все записи для этого идентификатора, если у ID нет «пропустить», а затем не копировать.

Кто-то сказал мне, что это должно быть сделано с переменными? Спасибо, много для вашей помощи

ОБНОВЛЕНИЕ; Текущий XSL

<?xml version="1.0" encoding="UTF-8"?> 
<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:template match="@*|node()"> 
    <comtec> 
     <xsl:for-each select="//record"> 
      <xsl:variable name="var_id2"> 
       <xsl:value-of select="column[@name='ColMiss']"/> 
      </xsl:variable> 
      <xsl:variable name="var_id3"> 
       <xsl:value-of select="column[@name='ColHave']"/> 
      </xsl:variable> 
      <xsl:if test="($var_id2 !='') "> 
       <xsl:variable name="var_id"> 
        <xsl:value-of select="column[@name='id_task']"/> 
       </xsl:variable> 
       <record> 
        <xsl:copy-of select="node()"/> 
       </record> 
      </xsl:if> 
     </xsl:for-each> 
    </comtec> 
</xsl:template> 
</xsl:stylesheet> 

Это выбирает все записи (но без атрибута «ID», который мне нужно), но не копировать все записи для id_task = 1, в моем примере, очевидно, почему, но я не знайте, как идти отсюда, чтобы сделать ожидаемый результат.

ответ

0

Вам не нужен переменные здесь, но вы могли бы извлечь выгоду из использования ключа для просмотра record элементов по идентификатору

<xsl:key name="record" match="record" use="column[@name='id_task']" /> 

Тогда это просто случай выбора record элементов, где запись в для его идентификатора указан ColMiss.

Попробуйте этот XSLT

<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:key name="record" match="record" use="column[@name='id_task']" /> 

<xsl:template match="@*|node()"> 
    <comtec> 
     <xsl:copy-of select="//record[key('record', column[@name='id_task'])/column[@name='ColMiss'][normalize-space()]]" /> 
    </comtec> 
</xsl:template> 
</xsl:stylesheet> 

Обратите внимание, что это не совсем эффективно, как вы будете проверять один и тот же узел, установленный для каждой записи в этом наборе. Вместо того, чтобы вы не можете использовать технику, называемую Muenchian grouping, так что вы только выполнить проверку ColMiss для первой записи в каждом наборе

<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:key name="record" match="record" use="column[@name='id_task']" /> 

<xsl:template match="@*|node()"> 
    <comtec> 
     <xsl:for-each select="//record 
           [generate-id() = generate-id(key('record', column[@name='id_task'])[1])] 
           [key('record', column[@name='id_task'])/column[@name='ColMiss'][normalize-space()]]"> 
      <xsl:copy-of select="key('record', column[@name='id_task'])" /> 
     </xsl:for-each> 
    </comtec> 
</xsl:template> 
</xsl:stylesheet> 
+0

спасибо, я буду изучать вашу ссылку, чтобы понять! – user3529643

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