2014-02-11 168 views
0

我需要從某些xml中刪除名稱空間前綴,但使用XSLT保留名稱空間。XSLT刪除名稱空間前綴,但使用JDK保留名稱空間XSLTC

這正是這裏描述 - How to remove namespace prefix leaving namespace value (XSLT)?

這時候我用XML文字編輯,但我在使用XSLTC工作的應用程序測試工作正常。不幸的是,它不適用於XSLTC。任何想法如何讓它工作?

這裏是源XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ns0:eBooking xmlns:ns0="http://test.com"> 
    <ns0:eventInfo Id="ID00000000000000000020" version="1"> 
    <ns0:Event> 
     <ns0:tpAmb>1</ns0:tpAmb> 
     <ns0:procEmi>1</ns0:procEmi> 
    </ns0:Event> 
    </ns0:eventInfo> 
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
     <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
     <Reference URI="#ID00000000000000000020"> 
     <Transforms> 
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
      <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
     <DigestValue>p42saeKIMnVR7/P/nzen8mTsq94=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue>SzLt....==</SignatureValue> 
    <KeyInfo> 
     <X509Data> 
     <X509Certificate>MIIHdzCCBV.......==</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
    </Signature> 
</ns0:eBooking> 

這裏是XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:ns0="http://test.com" 
       xmlns="http://test.com" > 
    <xsl:output indent="yes"/> 
    <xsl:template match="ns0:*"> 
     <xsl:element name="{local-name()}" > 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

當使用JDK XSLTC這給:

<?xml version="1.0" encoding="UTF-8"?> 
<eBooking> 
    <eventInfo Id="ID00000000000000000020" version="1"> 
    <Event> 
     <tpAmb>1</tpAmb> 
     <procEmi>1</procEmi> 
    </Event> 
    </eventInfo> 
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" **xmlns:ns0="http://test.com"**> 
    <SignedInfo> 
     <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
     <Reference URI="#ID00000000000000000020"> 
     <Transforms> 
      <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
      <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
     </Transforms> 
     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
     <DigestValue>p42saeKIMnVR7/P/nzen8mTsq94=</DigestValue> 
     </Reference> 
    </SignedInfo> 
    <SignatureValue>SzLt....==</SignatureValue> 
    <KeyInfo> 
     <X509Data> 
     <X509Certificate>MIIHdzCCBV.......==</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
    </Signature> 
</eBooking> 

,如果我與測試工作正常xml複製編輯器。

+1

那麼XSLTC會發生什麼?你會得到哪個結果? –

+0

最好添加一個源XML,一個所需的XML和其他相關信息,比如已經嘗試過的XSLT。 – user3159253

+0

這裏是源代碼xml: – user3292737

回答

0

這看起來像是在您使用的XSLTC版本中的錯誤,它應該使用樣式表中聲明的默認名稱空間。你或許可以解決這個問題有點了

<xsl:element name="{local-name()}" namespace="{namespace-uri()}" > 

至於你已經在Signature元素突出了xmlns:ns0,這其實是正確的行爲,因爲xsl:copy會將所有命名空間節點,當它複製的元素。爲了擺脫這個,你需要另一個模板

<!-- higher priority than node() but lower than ns0:* --> 
<xsl:template match="*" priority="-0.4"> 
    <xsl:element name="{name()}" namespace="{namespace-uri()}" > 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:element> 
</xsl:template> 
相關問題