Добавление нескольких пространств имен в XML-файл - PullRequest
2 голосов
/ 13 мая 2011

У меня есть XML-файл, а пространства имен указаны в XML-файле. Что мне нужно сделать, это использовать пространства имен, указанные только в XML-файле, и квалифицировать XML-файл. Ниже приведен пример XML-файла.

<Ticketing xmlns="ticketing.4.0" mfAction="BOOKING">
  <Reference>
    <Code>190</Code>
  </Reference>
  <BookingID>194283532</BookingID>
  <BookingCode>MCHOI190</BookingCode>
  <BookingDate>2011-04-21T15:40:04.000</BookingDate>
  <Persons>
    <Person>
      <Code>ADULT</Code>
      <Count>2</Count>
    </Person>
    <Person>
      <Code>CHILD</Code>
      <Count>2</Count>
    </Person>
  </Persons>
  <CreditCards>
    <CreditCard BookingType="BOOKING">
      <BookCreditCard xmlns="creditcard.3.0">
        <CardCode>VS</CardCode>
        <CardNumber>4444333322221111</CardNumber>
        <CardExpire>2011-12-31</CardExpire>
      </BookCreditCard>
    </CreditCard>
  </CreditCards>
</Ticketing>

Я должен использовать пространства имен, уже присутствующие в файле xml, дать им префикс и квалифицировать xml с этими пространствами имен. Вывод должен быть таким, как показано ниже: -

<ticket:Ticketing xmlns:ticket="ticketing.4.0" mfAction="BOOKING">
  <ticket:Reference>
    <ticket:Code>190</ticket:Code>
  </ticket:Reference>
  <ticket:BookingID>194283532</ticket:BookingID>
  <ticket:BookingCode>MCHOI190</ticket:BookingCode>
  <ticket:BookingDate>2011-04-21T15:40:04.000</ticket:BookingDate>
  <ticket:Persons>
    <ticket:Person>
      <ticket:Code>ADULT</ticket:Code>
      <ticket:Count>2</ticket:Count>
    </ticket:Person>
    <ticket:Person>
      <ticket:Code>CHILD</ticket:Code>
      <ticket:Count>2</ticket:Count>
    </ticket:Person>
  </ticket:Persons>
  <ticket:CreditCards>
    <ticket:CreditCard BookingType="BOOKING">
      <credit:BookCreditCard xmlns:credit="creditcard.3.0">
        <credit:CardCode>VS</credit:CardCode>
        <credit:CardNumber>4444333322221111</credit:CardNumber>
        <credit:CardExpire>2011-12-31</credit:CardExpire>
      </credit:BookCreditCard>
    </ticket:CreditCard>
  </ticket:CreditCards>
</ticket:Ticketing>

Может кто-нибудь подсказать, как это реализовать. Спасибо Рудра

Ответы [ 3 ]

0 голосов
/ 14 мая 2011

В XSLT 1.0 не существует гарантированного решения, поскольку реализации могут свободно использовать любой префикс в выходном файле, который они хотят. Однако большинство процессоров делают разумные вещи, и поэтому решение @ empo обычно будет работать. В XSLT 2.0 он гарантированно работает.

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

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ticket="ticketing.4.0" xmlns:credit="creaditcard.3.0">

 <xsl:output indent="yes"/>

 <xsl:template match="ticket:*">
   <xsl:element name="ticket:{local-name()}">
    <xsl:apply-templates select="node()|@*"/>
   </xsl:element>
 </xsl:template>

 <xsl:template match="credit:*">
  <xsl:element name="credit:{local-name()}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>

 </xsl:stylesheet>
0 голосов
/ 14 мая 2011

Более общее решение (без жестко заданных префиксов и может работать с любым количеством пространств имен):

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

 <xsl:template match="@*">
  <xsl:copy-of select="."/>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name=
  "{substring(namespace-uri(),1,6)}:{local-name()}"
       namespace="{namespace-uri()}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<Ticketing xmlns="ticketing.4.0" mfAction="BOOKING">
    <Reference>
        <Code>190</Code>
    </Reference>
    <BookingID>194283532</BookingID>
    <BookingCode>MCHOI190</BookingCode>
    <BookingDate>2011-04-21T15:40:04.000</BookingDate>
    <Persons>
        <Person>
            <Code>ADULT</Code>
            <Count>2</Count>
        </Person>
        <Person>
            <Code>CHILD</Code>
            <Count>2</Count>
        </Person>
    </Persons>
    <CreditCards>
        <CreditCard BookingType="BOOKING">
            <BookCreditCard xmlns="creditcard.3.0">
                <CardCode>VS</CardCode>
                <CardNumber>4444333322221111</CardNumber>
                <CardExpire>2011-12-31</CardExpire>
            </BookCreditCard>
        </CreditCard>
    </CreditCards>
</Ticketing>

желаемый, правильный результат получен :

<ticket:Ticketing xmlns:ticket="ticketing.4.0" mfAction="BOOKING">
   <ticket:Reference>
      <ticket:Code>190</ticket:Code>
   </ticket:Reference>
   <ticket:BookingID>194283532</ticket:BookingID>
   <ticket:BookingCode>MCHOI190</ticket:BookingCode>
   <ticket:BookingDate>2011-04-21T15:40:04.000</ticket:BookingDate>
   <ticket:Persons>
      <ticket:Person>
         <ticket:Code>ADULT</ticket:Code>
         <ticket:Count>2</ticket:Count>
      </ticket:Person>
      <ticket:Person>
         <ticket:Code>CHILD</ticket:Code>
         <ticket:Count>2</ticket:Count>
      </ticket:Person>
   </ticket:Persons>
   <ticket:CreditCards>
      <ticket:CreditCard BookingType="BOOKING">
         <credit:BookCreditCard xmlns:credit="creditcard.3.0">
            <credit:CardCode>VS</credit:CardCode>
            <credit:CardNumber>4444333322221111</credit:CardNumber>
            <credit:CardExpire>2011-12-31</credit:CardExpire>
         </credit:BookCreditCard>
      </ticket:CreditCard>
   </ticket:CreditCards>
</ticket:Ticketing>

Примечание : первые 6 символов пространства имен-uriкаждого элемента используются для префикса соответствующего сгенерированного имени.Следовательно, это решение работает правильно, если начальные 6 символов любого пространства имен uri элемента подчиняются синтаксическим правилам для NCName .

0 голосов
/ 14 мая 2011

Я не уверен, что это лучший способ сделать это. Но это делает работу:

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

 <xsl:output indent="yes"/>

 <xsl:template match="*">
   <xsl:element name="ticket:{name()}" namespace="ticketing.4.0">
    <xsl:apply-templates select="node()|@*"/>
   </xsl:element>
 </xsl:template>

 <xsl:template match="BookCreditCard|BookCreditCard//*"">
  <xsl:element name="credit:{name()}" namespace="creditcard.3.0">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>

 </xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...