2017-02-21 25 views
0

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

Я постараюсь описать то, что я имею в виду под с некоторой например входом и желаемый результат:

вход:

<shop> 
    <item> 
     <ID>12344</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
     <info> 
      <Attributes> 
       <authcode>DS2978</authcode> 
       <PRICE> 
        <CURRENCY>DKK</CURRENCY> 
        <SALESPRICE>296</SALESPRICE> 
       </PRICE> 
       <Condition>used</Condition> 
       <garanty>Yes</garanty> 
       <garanty_length>2 months</garanty_length> 
       <Label_name>demo</Label_name> 
      </Attributes> 
     </info> 
    </item> 
    <item> 
     <ID>12345</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
    </item> 
</shop> 

Желаемая выход:

<shop> 
    <item> 
     <ID>12344</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
     <info> 
      <Attributes> 
       <authcode>DS29783</authcode> 
       <PRICE> 
        <CURRENCY>DKK</CURRENCY> 
        <SALESPRICE>296</SALESPRICE> 
       </PRICE> 
       <Condition>used</Condition> 
       <garanty>Yes</garanty> 
       <garanty_length>2 months</garanty_length> 
       <Label_name>demo</Label_name> 
      </Attributes> 
     </info> 
    </item> 
</shop> 

Таким образом, в основном, если <info> элемент не заполнен, то она должна скрыть весь <item> элемент.

Я надеюсь, что кто-то там захочет дать нам совет, как я мог бы это достичь. Благодаря

+0

Ваш вход не является корректным XML: отсутствует один корневой элемент, и между '' и' 'существует несоответствие' (XML чувствителен к регистру). Также обратите внимание, что 'info' в вашем примере является * элементом *, а не * атрибутом *. –

+1

Один из способов сделать это - использовать шаблон * identity transform *, а также пустой шаблон, соответствующий 'item [not (info)]'. –

+0

С моим редактированием я сменил два из ваших имен элементов: 'Item' на' item' и 'authcodeE' на' authcode', чтобы сделать XML-файлы хорошо сформированными. Считают, что. – zx485

ответ

1

Этот простой XSLT-1,0 шаблон должен сделать это:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*" /> 

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

    <!-- This template does remove the 'item' elements which do not have 'info' children --> 
    <xsl:template match="item[not(info)]" /> 

</xsl:stylesheet> 

Это XSLT просто применяет identity template для всех узлов и игнорирует все item узлы, которые не имеют info детей.
<xsl:strip-space... удаляет пустое пространство игнорируемых элементов.

+0

Zx485. Большое спасибо! вы спасли меня довольно долго. – alex

+1

@alex: Рад прочитать это :-) Вы можете подчеркнуть свою признательность, приняв этот ответ. – zx485

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

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