2014-10-08 2 views
1

После того, как я поставил свой вопрос, мне удалось переместить узел вверх (Moving nodes up using XSLT). После этого я подумал, что понял, поэтому попробовал сделать наоборот, чтобы переместить узел вниз. Не работает. Это то, что я сделал:Перемещение узлов вниз с помощью XSLT

Мой ввод данных называется DEBTORS.xml:

<?xml version="1.0" ?> 
<eExact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eExact-Schema.xsd"> 
<Accounts> 
<Account code="     001" status="A" type="C"> 
    <Name>Name</Name> 
    <Contacts> 
    <Contact default="1" gender="M" status="A"> 
    <Note>Patient: 1</Note> 
    <FirstName></FirstName> 
    <Addresses> 
    <Address type="D" desc=""> 
     <AddressLine1>Street</AddressLine1> 
     <AddressLine2></AddressLine2> 
     <AddressLine3></AddressLine3> 
     <PostalCode>0000 AA</PostalCode> 
     <City>&apos;City</City> 
     <Country code="NL"/> 
     <Phone></Phone> 
     <Fax></Fax> 
    </Address> 
    </Addresses> 
    <Language code="NL"/> 
    <JobDescription>--</JobDescription> 
    <Phone></Phone> 
    <PhoneExt></PhoneExt> 
    <Fax></Fax> 
    <Mobile></Mobile> 
    <Email></Email> 
    <WebAccess>0</WebAccess> 
    </Contact> 
    </Contacts> 
    <Debtor number=" 1" code="     1"> 
    <Currency code="EUR"/> 
    </Debtor> 
    </Account> 
</Accounts> 
</eExact> 

Мой XSL называется Test2.xsl

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<!-- Indentation in XSL --> 
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/> 

<!-- Removing blank lines in XSL --> 
<xsl:strip-space elements="*"/> 

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

<!-- special rules ... --> 
    <xsl:template match="Account"> 
     <xsl:copy> 
      <!-- exclude Name --> 
      <xsl:apply-templates select="@* | node()[not(self::Name)]"/> 
     </xsl:copy> 
</xsl:template> 

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

</xsl:stylesheet> 

Требуются выход:

<?xml version="1.0" ?> 
<eExact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eExact-Schema.xsd"> 
<Accounts> 
<Account code="     001" status="A" type="C"> 
    <Contacts> 
    <Contact default="1" gender="M" status="A"> 
    <Name>Name</Name> 
    <Note>Patient: 1</Note> 
    <FirstName></FirstName> 
    <Addresses> 
    <Address type="D" desc=""> 
     <AddressLine1>Street</AddressLine1> 
     <AddressLine2></AddressLine2> 
     <AddressLine3></AddressLine3> 
     <PostalCode>0000 AA</PostalCode> 
     <City>&apos;City</City> 
     <Country code="NL"/> 
     <Phone></Phone> 
     <Fax></Fax> 
    </Address> 
    </Addresses> 
    <Language code="NL"/> 
    <JobDescription>--</JobDescription> 
    <Phone></Phone> 
    <PhoneExt></PhoneExt> 
    <Fax></Fax> 
    <Mobile></Mobile> 
    <Email></Email> 
    <WebAccess>0</WebAccess> 
    </Contact> 
    </Contacts> 
    <Debtor number=" 1" code="     1"> 
    <Currency code="EUR"/> 
    </Debtor> 
    </Account> 
</Accounts> 
</eExact> 

Моя проблема в том, что с моим XSL узел «Имя» удаляется, но не вернуться как ребенок контакта. Надеюсь, кто-то мне поможет?

ответ

1

Я рекомендовал бы несколько изменений:

  1. Для подавления Name, добавить правило шаблона, который соответствует его, но не делает ничего .
  2. Чтобы добавить Name в Contact, добавьте правило шаблона, которое соответствует Contact и копиям, как обычно, но также вставляет Name.
  3. Убрать подходящий шаблон Contacts (множественное число); правило общего назначения может обрабатывать этот штраф.

Вот ваша полная таблица стилей обновляется, как упоминалось:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- Indentation in XSL --> 
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes" 
       encoding="UTF-8" indent="yes"/> 

    <!-- Removing blank lines in XSL --> 
    <xsl:strip-space elements="*"/> 

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

    <!-- special rules ... --> 
    <xsl:template match="Name"/> 

    <xsl:template match="Contact"> 
    <xsl:copy> 
     <!-- include Name --> 
     <xsl:apply-templates select="@*"/> 
     <Name><xsl:value-of select="../../Name"/></Name> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Учитывая ваш входной образец XML, выше XSLT производит требуемый выходной XML:

<eExact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="eExact-Schema.xsd"> 
    <Accounts> 
     <Account code="     001" status="A" type="C"> 
     <Contacts> 
      <Contact default="1" gender="M" status="A"> 
       <Name>Name</Name> 
       <Note>Patient: 1</Note> 
       <FirstName/> 
       <Addresses> 
        <Address type="D" desc=""> 
        <AddressLine1>Street</AddressLine1> 
        <AddressLine2/> 
        <AddressLine3/> 
        <PostalCode>0000 AA</PostalCode> 
        <City>'City</City> 
        <Country code="NL"/> 
        <Phone/> 
        <Fax/> 
        </Address> 
       </Addresses> 
       <Language code="NL"/> 
       <JobDescription>--</JobDescription> 
       <Phone/> 
       <PhoneExt/> 
       <Fax/> 
       <Mobile/> 
       <Email/> 
       <WebAccess>0</WebAccess> 
      </Contact> 
     </Contacts> 
     <Debtor number=" 1" code="     1"> 
      <Currency code="EUR"/> 
     </Debtor> 
     </Account> 
    </Accounts> 
</eExact> 
+0

Спасибо вам большое ! – Apojoost

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