2017-09-15 84 views
0

我有一個xml文件,我需要替換其中一個標記而不替換命名空間的傳入前綴。例如,對於以下XML:使用XSLT替換xml標記

<f:table xmlns:f="https://www.test.com"> 
  <f:name>Peter</f:name> 
  <f:lname>Jenkins</f:lname> 
  <f:height>71</f:height> 
</f:table> 

我需要用姓氏替換lname,但仍保留前綴(本例中爲f)完好無損。期望的輸出將如下所示。注意前綴可以改變,所以它不會總是

<f:table xmlns:f="https://www.test.com"> 
  <f:name>Peter</f:name> 
  <f:lastname>Jenkins</f:lastname> 
  <f:height>71</f:height> 
</f:table> 

F I有以下XSLT嘗試,這將與姓氏替代L-NAME沒有原始前綴完好無損。請幫助

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="table/lname"> 
     <lastname><xsl:apply-templates select="@*|node()" /></lastname> 
    </xsl:template> 
</xsl:stylesheet> 

回答

0

前綴無意義。以下樣式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns0="https://www.test.com"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="ns0:lname"> 
    <ns0:lastname> 
     <xsl:apply-templates/> 
    </ns0:lastname> 
</xsl:template> 

</xsl:stylesheet> 

當施加到你的輸入例如,將返回:

<?xml version="1.0" encoding="UTF-8"?> 
<f:table xmlns:f="https://www.test.com"> 
    <f:name>Peter</f:name> 
    <ns0:lastname xmlns:ns0="https://www.test.com">Jenkins</ns0:lastname> 
    <f:height>71</f:height> 
</f:table> 

這是語義上等同於您的問題所示的輸出。


如果由於某種原因,你真的需要保留原始前綴,你可以這樣做:

<xsl:template match="ns0:lname"> 
    <xsl:variable name="uri" select="'https://www.test.com'" /> 
    <xsl:variable name="prefix" select="name(namespace::*[.=$uri])" /> 
    <xsl:element name="{$prefix}:lastname" namespace="{$uri}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
+0

謝謝了!那就是訣竅 –