2016-07-18 98 views
1

請參閱XSLT,輸入XML,所需的輸出XML和實際輸出,我在下面。如何在執行XSLT處理時保留名稱空間前綴

  • 我需要刪除所有的標籤,如果它沒有價值或空白(s)。 如:刪除<abc></abc>
  • 使用下面的XSLT,空標籤轉換爲自行閉合的標籤(這是我完全想刪除)同樣的命名空間越來越去除 如:<soapenv:Body>被轉化爲<Body>(我想保持原樣)
  • 請幫助我實現所需的輸出而不刪除名稱空間前綴。

XSLT

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="grandParent"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
      <childValues> 
       <xsl:value-of select="normalize-space(.)" /> 
      </childValues> 
      <xsl:apply-templates select="node()" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>    

輸入XML--

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
message-id="81"> 
     <netconf:edit-config> 
     <netconf:target> 
      <netconf:url/> 
     </netconf:target> 
     <netconf:config> 
      <requests module="E5100"> 
      <request action="create" userName="sigma" sessionId="_sessionId"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <PortNumber>2</PortNumber> 
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr></UserDescr> 
        <SubscriberID></SubscriberID> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </netconf:config> 
      </netconf:edit-config> 
     </netconf:rpc> 
     </soapenv:Body> 
    </soapenv:Envelope> 

所需的輸出XML:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <netconf:rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
message-id="81"> 
     <netconf:edit-config> 
     <netconf:target> 
      <netconf:url/> 
     </netconf:target> 
     <netconf:config> 
      <requests module="E5100"> 
      <request action="create" sessionId="_sessionId" userName="sigma"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <!-- Port Number removed-->     
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr/> 
        <SubscriberID/> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </netconf:config> 
      </netconf:edit-config> 
     </netconf:rpc> 
     </soapenv:Body> 
    </soapenv:Envelope> 

實際輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <Body> 
    <rpc xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    message-id="81"> 
     <edit-config> 
     <target> 
      <url/> 
     </target> 
     <config> 
      <requests module="E5100"> 
      <request action="create" sessionId="_sessionId" userName="sigma"> 
       <SSA> 
       <NetworkName>NTWK-ntwk_nm</NetworkName> 
       <!-- want to remove this PortNumber completely--> 
       <PortNumber/>     
       <PortType>vdsl</PortType> 
       <SSAProvision> 
        <UserDescr/> 
        <SubscriberID/> 
       </SSAProvision> 
       </SSA> 
      </request>    
       </requests> 
      </config> 
      </edit-config> 
     </rpc> 
     </Body> 
    </Envelope> 
+0

** ** 1您的問題不能使用你的代碼被複制 - 看到:HTTP://的XslTransform .net/94rmq7j - ** 2。** XML輸入中沒有'grandParent'元素,因此第二個模板不會執行任何操作。 –

+1

謝謝邁克爾,我對此非常陌生,由於某種原因,我必須儘快完成工作。我同意,在線xslt解析器可以工作,但在我嘗試的環境中以及某些基於Java的公司特定工具中,它將刪除名稱空間前綴。任何可能出現問題的指針或我需要檢查的內容。 – Ramesh

+1

我假定您知道輸出文檔的節點仍然位於正確的名稱空間中(命名空間不*被移除),並且任何分析器或XML處理工具都應該可以工作,不管您是設置默認命名空間還是設置命名空間明確地通過前綴。 –

回答

2

要刪除沒有內容的元素,你可以添加一個模板規則

<xsl:template match="*[not(child::node())]"/>

正如其他人說,命名空間信息的損失是一個錯誤在正在使用的工具鏈中。我建議(a)確切地確定正在使用哪個工具鏈,(b)檢查是否存在錯誤可能修復的相同工具的更新版本,(c)如果失敗,則轉移到不同的XSLT處理器和/或XML解析器。

有時發現正在使用哪些XSLT處理器最簡單的方法是添加類似:

<xsl:template match="/"> 
    <xsl:comment>Generated using <xsl:value-of select="system-property('xsl:vendor')"/></xsl:comment> 
    <xsl:apply-templates/> 
</xsl:template> 
相關問題