2015-07-23 4 views
0

Удаление specfic узлов из XML с помощью XSLTУдаление specfic узлов из XML с помощью XSLT

мой вопрос имеет две части

1) удаление specfic узлов из XML с помощью XSLT

2) один раз в XSLT , это должно быть сделано во время выполнения. Устанавливаемые значения узлов будут переданы как параметр

  <?xml version="1.0" encoding="UTF-8"?> 
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Header> 
     <Category>History</Category>   
    </Header> 
    <Body messagetype="Personal"> 
     <Books> 
      <Book> 
       <authorDetails> 
        <title>The white tiger</title> 
        <author>Arvind Adiga</author>     
       </authorDetails>     
        <sellerDetails sellerType="Private"> 
         <address > 
          <country>India</country> 
          <city>chennai</city> 
          </address >      
       </sellerDetails> 
       <identification>      
        <isbnNumber>AAAA1234</isbnNumber>     
       </identification> 
      </Book> 
      <Book> 
       <authorDetails> 
        <title>The white tiger</title> 
        <author>Arvind Adiga</author>     
       </authorDetails>     
        <sellerDetails sellerType="Private"> 
         <address > 
          <country>India</country> 
          <city>chennai</city> 
          </address >      
       </sellerDetails> 
       <identification>      
        <isbnNumber>BBB12343</isbnNumber>     
       </identification> 
      </Book> 
     </Books> 
    </Body> 
</Message> 

Th e выше - образец xml , номер isbn будет передаваться динамически, и xslt должен иметь возможность получать значения номера isbn в качестве параметра в java-коде и удалять определенные узлы во время выполнения и преобразовывать xml с узлами прошел.

жаль кладя botht вопрос в том же месте это willbe удобно, если я получить ответы отдельно

До сих пор я удалось создать этот XSLT, который возвращает все значения

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

    <xsl:param name="codes"/> 

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

    <xsl:template match="segment"> 
     <xsl:choose> 
      <xsl:when test="contains($codes, code/@Value)" /> <!-- Do nothing --> 
      <xsl:otherwise> 
       <xsl:copy> 
        <xsl:apply-templates select="@*|node()"/> 
       </xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Martin THATS 100 баллов за ответ, который вы дали, и он работал хорошо, У меня все еще есть проблема, что я дал exmaple xml для простоты/соображений безопасности здесь, но исходный xml, с которым я работаю, имеет пространство имен и также как ant isbn number не является прямым элементом в качестве мено определяется здесь

Пожалуйста, смотрите ниже исходного XML и трансформировали XML после применения XSLT оригинальный XML

<?xml version="1.0" encoding="UTF-8"?> 
<dt:Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dt="urn:aaaaaaaa" xmlns="urn:bbbbbbb" xmlns:cm="urn:cccccccc" xmlns:stf="dddddd" "> 
    <Header> 
     <Category>History</Category>   
    </Header> 
    <dt:Body > 
     <Books> 
      <Book> 
       <authorDetails> 
        <cm:Birth> 
         <cm:BirthDate> 
          <cm:DateYMD>1988-01-01</cm:DateYMD> 
         </cm:BirthDate> 
        </cm:Birth> 
        <cm:Address addressType="residential"> 
         <cm:CountryCode>GB</cm:CountryCode> 
         <cm:AddressStruct> 
          <cm:Street>london</cm:Street>       
          <cm:PostCode>sddas</cm:PostCode> 
          <cm:City>london</cm:City> 
         </cm:AddressStruct> 
        </cm:Address> 
        <cm:Name> 
         <cm:NameFree>James Bond</cm:NameFree> 
        </cm:Name>    
       </authorDetails> 
       <sellerDetails> 
        <sellerDetail sellerType="Private"> 
        </sellerDetail> 
       </sellerDetails> 
       <BookSpec> 
        <stf:BookTypeIndic>2</stf:BookTypeIndic> 
        <stf:BookRefId>AAAAAA111111111</stf:BookRefId> 
        <stf:BookCorrRefId>BBBBBB2222222222</stf:BookCorrRefId> 
       </BookSpec> 
      </Book> 

      <Book> 
       <authorDetails> 
        <cm:Birth> 
         <cm:BirthDate> 
          <cm:DateYMD>1995-01-01</cm:DateYMD> 
         </cm:BirthDate> 
        </cm:Birth> 
        <cm:Address addressType="residential"> 
         <cm:CountryCode>GB</cm:CountryCode> 
         <cm:AddressStruct> 
          <cm:Street>ripper Street</cm:Street>        
          <cm:PostCode>sddas</cm:PostCode> 
          <cm:City>london</cm:City> 
         </cm:AddressStruct> 
        </cm:Address> 
        <cm:Name> 
         <cm:NameFree>James Bond</cm:NameFree> 
        </cm:Name>    
       </authorDetails> 
       <sellerDetails> 
        <sellerDetail sellerType="Private"> 
        </sellerDetail> 
       </sellerDetails> 
       <BookSpec> 
        <stf:BookTypeIndic>2</stf:BookTypeIndic> 
        <stf:BookRefId>CCCCCC33333333</stf:BookRefId> 
        <stf:BookCorrRefId>DDDDDD4444444</stf:BookCorrRefId> 
       </BookSpec> 
      </Book> 


      <Book> 
       <authorDetails> 
        <cm:Birth> 
         <cm:BirthDate> 
          <cm:DateYMD>1995-01-01</cm:DateYMD> 
         </cm:BirthDate> 
        </cm:Birth> 
        <cm:Address addressType="residential"> 
         <cm:CountryCode>GB</cm:CountryCode> 
         <cm:AddressStruct> 
          <cm:Street>ripper Street</cm:Street>        
          <cm:PostCode>sddas</cm:PostCode> 
          <cm:City>london</cm:City> 
         </cm:AddressStruct> 
        </cm:Address> 
        <cm:Name> 
         <cm:NameFree>James Bond</cm:NameFree> 
        </cm:Name>    
       </authorDetails> 
       <sellerDetails> 
        <sellerDetail sellerType="Private"> 
        </sellerDetail> 
       </sellerDetails> 
       <BookSpec> 
        <stf:BookTypeIndic>2</stf:BookTypeIndic> 
        <stf:BookRefId>EEEEEE555555555</stf:BookRefId> 
        <stf:BookCorrRefId>FFFFFF66666666666</stf:BookCorrRefId> 
       </BookSpec> 
      </Book>  
     </Books> 
    </dt:Body> 
</dt:Message> 

Преобразованный XML при переходе параметров { " 'CCCCCC33333333', 'EEEEEE555555555'"}

<?xml version="1.0" encoding="UTF-8"?> 
<dt:Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dt="urn:aaaaaaaa" xmlns="urn:bbbbbbb" xmlns:cm="urn:cccccccc" xmlns:stf="dddddd" "> 
    <Header> 
     <Category>History</Category>   
    </Header> 
    <dt:Body > 
     <Books> 
      <Book> 
       <authorDetails> 
        <cm:Birth> 
         <cm:BirthDate> 
          <cm:DateYMD>1988-01-01</cm:DateYMD> 
         </cm:BirthDate> 
        </cm:Birth> 
        <cm:Address addressType="residential"> 
         <cm:CountryCode>GB</cm:CountryCode> 
         <cm:AddressStruct> 
          <cm:Street>london</cm:Street>       
          <cm:PostCode>sddas</cm:PostCode> 
          <cm:City>london</cm:City> 
         </cm:AddressStruct> 
        </cm:Address> 
        <cm:Name> 
         <cm:NameFree>James Bond</cm:NameFree> 
        </cm:Name>    
       </authorDetails> 
       <sellerDetails> 
        <sellerDetail sellerType="Private"> 
        </sellerDetail> 
       </sellerDetails> 
       <BookSpec> 
        <stf:BookTypeIndic>2</stf:BookTypeIndic> 
        <stf:BookRefId>AAAAAA111111111</stf:BookRefId> 
        <stf:BookCorrRefId>BBBBBB2222222222</stf:BookCorrRefId> 
       </BookSpec> 
      </Book>  
     </Books> 
    </dt:Body> 
</dt:Message> 
+0

Вы говорите «узлы» во множественном числе. Это будет строка? Если да, можете ли вы показать нам, как именно он будет отформатирован? Или, может быть, вы предпочли бы иметь коды в другом документе XML и передать путь к этому документу в качестве параметра? –

+0

Почему у вас есть «match =» сегмент «' в XSLT, но не элемент 'segment' в образце ввода XML? –

+0

@Martin Honnen -sorry матч должен быть сделан в книгах как match = "Book" –

ответ

0

Если вы используете http://xsltransform.net/eiZQaG7:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="isbns-to-remove" select="'BBB12343'"/> 

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

    <xsl:template match="Book"> 
     <xsl:if test="not(contains(concat(',', $isbns-to-remove, ','), concat(',', identification/isbnNumber, ',')))"> 
      <xsl:call-template name="identity"/> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

вы можете передать строку с одним номером ISBN или строку с запятыми список номеров ISBN и таблица стилей будет копировать только те Book элементы в результате которых identification/isbnNumber не содержится в параметре.

Как вы уже размещены более сложный ввод XML с использованием пространств имен образец пути в коде XSLT должны быть адаптированы:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:df="urn:bbbbbbb" 
    xmlns:stf="dddddd" 
    exclude-result-prefixes="df stf"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="isbns-to-remove" select="'CCCCCC33333333,EEEEEE555555555'"/> 

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

    <xsl:template match="df:Book"> 
     <xsl:if test="not(contains(concat(',', $isbns-to-remove, ','), concat(',', df:BookSpec/stf:BookRefId, ',')))"> 
      <xsl:call-template name="identity"/> 
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Martin, который на 100% отвечает за ответ, который вы дали, и он отлично работал, –

+0

Martin thats 100 метки для ответа, который вы дали, и он работал хорошо, У меня все еще есть проблема, что я дал exmaple xml для простоты/соображений безопасности здесь, но исходный xml, с которым я работаю, имеет пространство имен и также как ant isbn number is is не прямой элемент, как упоминалось здесь см. измененный xml ..i отредактировал этот вопрос сейчас. Как выглядит исходный xml –

+0

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