2013-06-18 7 views
0

Это мой новый (отредактированный) более полный сценарий: У меня есть xml, который преобразуется с помощью xsl. Я получил пример от клиента, который выглядит как: XML, который входной_файл:Как показать пространства имен внутри xml с помощью xsl?

<?xml version="1.0" encoding="utf-8"?> 
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:sentFr>123456</tns:sentFr> 
    </tns:myCompanyHeader> 
    <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:myCompanyUser ssn="1234567890"> 
     <tns:firstName>John</tns:firstName> 
    </tns:myCompanyUser> 
    </tns:myCompanyUsers> 
</xsi:myCompanyImport> 

XSL-файл:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:tns="http://www.MyComp.se/myCompany" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.MyComp.se/myCompany myCompanyUsers.xsd" 
           xmlns:local="urn:cs"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:element name="xsi:myCompanyImport" namespace="http://www.w3.org/2001/XMLSchema-instance"> 
      <!--Start Header--> 
      <xsl:element name="tns:myCompanyHeader" > 
       <xsl:element name="tns:sentFr" > 
        <xsl:value-of select="_x0023_MyComp_header/@SentFrom" /> 
       </xsl:element> 
      </xsl:element> 
      <!--End Header--> 

      <!--Start Users--> 
      <xsl:element name="tns:myCompanyUsers"> 
       <!--Loop through persons--> 
       <xsl:for-each select="_x0023_MyComp_header/_x0023_MyComp_Employee"> 
        <xsl:element name="tns:myCompanyUser" > 
         <xsl:attribute name="ssn"> 
          <xsl:value-of select="@inSsn" /> 
         </xsl:attribute> 
         <xsl:element name="tns:firstName" > 
          <xsl:value-of select="@inFname"/> 
         </xsl:element> 
        </xsl:element> 
       </xsl:for-each> 
       <!--End Loop--> 
      </xsl:element> 
      <!--End Users--> 

     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

(Nevermind о Csharp-кода в XSL, он используется для цели здесь не показано) Таким образом, результат теперь:.

<?xml version="1.0" encoding="utf-8"?> 
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:sentFr>123456</tns:sentFr> 
    </tns:myCompanyHeader> 
    <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:myCompanyUser ssn="1234567890"> 
     <tns:firstName>John</tns:firstName> 
    </tns:myCompanyUser> 
    </tns:myCompanyUsers> 
</xsi:myCompanyImport> 

Но клиент хочет:

<?xml version="1.0" encoding="utf-8"?> 
<xsi:myCompanyImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <tns:myCompanyHeader xmlns:tns="http://www.MyComp.se/myCompany"> 
    <tns:sentFr>123456</tns:sentFr> 
    </tns:myCompanyHeader> 
    <tns:myCompanyUsers xmlns:tns="http://www.MyComp.se/myCompany" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.maxm.se/myCompany myCompanyUsers.xsd"> 
    <tns:myCompanyUser ssn="1234567890"> 
     <tns:firstName>John</tns:firstName> 
    </tns:myCompanyUser> 
    </tns:myCompanyUsers> 
</xsi:myCompanyImport> 

Как я могу написать это в xsl, чтобы он появился в xml? Я пробовал много разных способов, но безуспешно. Это на самом деле только эти 2 строки я бы добавить к ТНС: myCompanyUsers:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.maxm.se/myCompany myCompanyUsers.xsd"> 

Я хочу, чтобы в Но не успех.!

+0

Вы уверены, что пользовательские данные находятся в пространстве имен xsi? Это совершенно странно. Но сложно помочь вам больше, я не могу понять, что вы хотите получить от своей трансформации. –

+0

Ehm. Ну, они изменили свои требования несколько раз, и каждый раз, когда мы разговариваем с ними, я получаю новую информацию. Я поставлю более полный сценарий через некоторое время. – user2497316

ответ

2

Как я могу написать это в xsl, чтобы оно отображалось в xml?

записать его в буквальном смысле, то есть вместо того, чтобы

<xsl:element name="myns:myCustomerUsers" > 

использование

<myns:myCustomerUsers xmlns:tns="http://www.myCustomerWeb.se/myCustomer" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.myCustomerWeb.se/myCustomer myexuser.xsd"> 

или просто как

<myns:myCustomerUsers 
    xsi:schemaLocation="http://www.myCustomerWeb.se/myCustomer myexuser.xsd"> 

, поскольку буквенные результат элементы наследуют узлы пространства имен, которые были в области видимости в этот момент в таблице стилей (в вашем случае, заявленные на <xsl:stylesheet>). Вероятно, вам нужно добавить exclude-result-prefixes="msxsl" в ваш элемент <xsl:stylesheet>, иначе элемент myns:myCustomerUsers также получит объявление xmlns:msxsl="urn:schemas-microsoft-com:xslt".

Вам нужно использовать только <xsl:element>, когда имя элемента не является константой.

+0

Я просто поставил более полный код-пример abowe. – user2497316

+0

@ user2497316 применяется тот же совет - если у вас есть определенный элемент с фиксированным именем, которое вы хотите включить в вывод, то просто поместите его в таблицу стилей как литеральный элемент, вам не нужно '', если вы не хотите для динамического создания имени элемента. –

+0

Извините, я не прочитал ваш первый ответ правильно. Конечно, вы правы, я написал это как есть в теге, и viola! Спасибо большое. J – user2497316

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