2017-01-09 12 views
2

Я пытаюсь сделать некоторые упражнения на XSLT, и это мой первый XSLT попытка:Добавить элементы XML используя для-каждого из XSLT, только если значение тега не пустой

У меня есть следующий XML, как мой вход

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <elementA> 
     <elementB attB="valueb"> 
      <elementC attC="c-value"> 
       what I want 
      </elementC> 
     </elementB> 
     <elementB attB="valueb"> 

     </elementB> 
    </elementA> 
</root> 

и следующий XSLT:

<?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="/root/elementA"> 
     <newElement> 
      <xsl:for-each select="elementB[@attB='valueb']"> 
       <valuef> 
        <xsl:for-each select="./elementC"> 
         <xsl:value-of select="."> 
         </xsl:value-of> 
        </xsl:for-each> 
       </valuef> 
      </xsl:for-each> 
     </newElement> 
    </xsl:template> 
</xsl:stylesheet> 

Преобразованный XML я получаю:

<newElement> 
    <valuef> 
      what I want 
    </valuef> 
    <valuef/> 
</newElement> 

Я хочу, чтобы избавиться от пустых тегов (valuef) (они создаются из-за elementB не имея elementC как ребенок).

Где я делаю неправильно?

Спасибо!

+0

Для ваших фрагментов XML и XSLT результат, полученный с помощью http://xsltransform.net/pPJ8LVC, представляет собой просто пустой элемент ''. Поэтому рассмотрите вопрос о редактировании вопроса и предоставите XML-ввод, для которого вы получите вывод, который, как вы говорите, получите. –

+0

Done- Спасибо и извините за то, что не поставлял отложенный код. – user2522941

ответ

0

Если вы хотите отобразить каждый elementC к valuef, то вы можете просто использовать

<xsl:for-each select="elementB[@attB='valueb']/elementC"> 
     <valuef>     
       <xsl:value-of select="."/> 
     </valuef> 
    </xsl:for-each> 

что путь для ввода

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <elementA> 
     <elementB attB="valueb"> 
      <elementC attC="c-value"> 
       what I want 
      </elementC> 
     </elementB> 
     <elementB attB="valueb"> 

     </elementB> 
     </elementA> 
</root> 

выход

<newElement> 
    <valuef> 
       what I want 
      </valuef> 
</newElement> 

см http://xsltransform.net/pPJ8LVC/1 ,

+0

Спасибо, но нет, это не то, что мне нужно. Кроме того, для записи, не содержащей раздел интереса, ваш код также создает избыточные (пустые) записи. – user2522941

+0

У меня нет пустых записей для ввода в ваш вопрос. –

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

  • Нет связанных вопросов^_^