2011-05-13 154 views
2

我有一個xml文件,命名空間在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> 

有人可以建議如何實現這一點。 謝謝 Rudra

+0

是不是正確,''和''標籤沒有名稱空間? – 2011-05-13 19:42:50

+0

爲什麼'Ticketing'開放式標籤沒有名稱空間,而結束標籤與? BookCreditCard也是一樣。我的意思是''和'' – 2011-05-13 20:12:48

+0

好問題,+1。查看我的答案,瞭解可以與任意數量的命名空間配合使用的一般解決方案。 – 2011-05-14 01:40:05

回答

0

我不確定是做到這一點的最佳方法。但它的工作:

<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> 
0

在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

的更通用的解決方案(沒有硬編碼的前綴,並且可以與任何數量的名稱空間的工作):

<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個字符符合NCName的sintactical規則,此解決方案就能正常工作。

+0

廣義的解決方案非常棒。感謝大家的幫助。我必須在xslt上學習更多。 – user752838 2011-05-15 20:15:46

相關問題