2015-03-30 6 views
1

Я пытаюсь фильтровать данные, а затем группировать их с помощью XSLT. Вот мой XMLФильтр и группа в XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<AccumulatedOutput> 
    <root> 
     <Header> 
      <Add>true</Add> 
      <Name>Subscriber</Name> 
      <Value>SAC</Value> 
     </Header> 
    </root> 
    <root> 
     <Header> 
      <Add>true</Add> 
      <Name>System</Name> 
      <Value>CBP</Value> 
     </Header> 
    </root> 
    <root> 
     <Header> 
      <Add>false</Add> 
      <Name>Subscriber</Name> 
      <Value>SAC</Value> 
     </Header> 
    </root> 
</AccumulatedOutput> 

То, что я хочу сделать то, что группа, основанная на Header/Name и но удалить группу, в которой Header/Add является ложным. Итак, в приведенном выше примере я создам две группы (одна для Name=Subscriber и другая для Name=System), но так как первая группа (с Name=Subscriber) содержит Add=false, я хочу проигнорировать это, и мой вывод должен содержать только один узел, например ниже

<?xml version = "1.0" encoding = "UTF-8"?> 
<root> 
    <Header> 
     <Name>System</Name> 
     <Value>CBP</Value> 
     <Add>true</Add> 
    </Header> 
</root> 

Я попытался использовать группу по методу, но не могу определить способ его фильтрации. Это будет большая помощь, если кто-то может дать мне некоторые указатели

Благодарности

+0

Выберите XSLT 1.0 или 2.0, а не оба. –

+0

Я не против использовать любой из них для решения этой проблемы, поэтому используется как – Kapil

+0

Что вы хотите делать с группами, которые содержат более одного элемента, вы хотите каким-то образом объединить их или вывести только все элементы? –

ответ

3

В XSLT 2.0, вы можете сделать:

<xsl:template match="/AccumulatedOutput"> 
    <root> 
     <xsl:for-each-group select="root/Header" group-by="Name"> 
      <xsl:if test="not(current-group()/Add='false')"> 
       <xsl:copy-of select="current-group()"/> 
      </xsl:if> 
     </xsl:for-each-group> 
    </root> 
</xsl:template> 
1

Нет явных XSLT условных инструкций:

<xsl:template match="/*"> 
    <root> 
     <xsl:for-each-group group-by="Name" select= 
     "root/Header[for $n in string(Name) 
         return every $h in /*/root/Header[Name eq $n] 
            satisfies not($h/Add eq 'false')]"> 
       <xsl:sequence select="current-group()"/> 
     </xsl:for-each-group> 
    </root> 
</xsl:template> 
Смежные вопросы