2013-06-26 112 views
-2

我需要能夠在XML複製節點的數據,而不是數據本身。XSLT,複製節點而不是在節點

例子:

<Report> 
    <PaymentAccountInfo>  
     <AccountName>Demo Disbursement Account</AccountName> 
    </PaymentAccountInfo> 
</Report>  

這將需要只是

<Report> 
    <PaymentAccountInfo> 
     <AcocuntName></AccountName> 
    </PaymentAccountInfo> 
</Report> 

謝謝!

+0

只是複製所有xml節點的常用方法。只有選擇應用模板爲「node()」。一直在網上尋找線索,至今沒有發現任何東西。 – MKidd

+0

好吧,那麼爲什麼問題的下降? – MKidd

+0

那不是我...... –

回答

0

你可以嘗試以下方法:

<?xml version='1.0'?> 
<xsl:stylesheet 
    version='1.0' 
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 

<xsl:output method="xml" 
    indent="yes" /> 

<xsl:template match="*"> 
    <xsl:element name="{name()}"> 
     <xsl:apply-templates select="* | @*"/> 
     <!-- 
     to also display text, change this line to 
     <xsl:apply-templates select="* | @* | text()"/> 
     --> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:attribute name="{name(.)}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

</xsl:stylesheet> 
+0

工作,謝謝! – MKidd

0

只是複製所有XML節點的常用方法。只有選擇的應用模板爲「節點()」只

所以你當前的XSLT是(或多或少)

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

您需要添加額外的模板壓制文本節點內AccountName元件

<xsl:template match="AccountName/text()" /> 

這將產生所需的

<Report> 
    <PaymentAccountInfo>  
     <AccountName/> 
    </PaymentAccountInfo> 
</Report> 

如果你想刪除所有文本節點,而不僅僅是那些內部AccountName(這也將刪除縮進,因爲這南瓜空白節點),只要使用的match="text()"代替match="AccountName/text()"

0

此修改恆等變換的意志做你想做的事。它具有用於AccountName元件,其僅輸出元件的標籤的獨特處理的特殊模板。

<?xml version="1.0" encoding="UTF-8"?> 
<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="AccountName"> 
    <xsl:copy/> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<?xml version="1.0" encoding="utf-8"?><Report> 
    <PaymentAccountInfo>  
    <AccountName/> 
    </PaymentAccountInfo> 
</Report> 
0

如果你想從所有元素刪除文本的內容,您可以通過更換*修改node()identity transform

這也將去掉註釋和處理指令的,所以無論是:

  • 添加comment()和/或processing-instruction()**|comment()|processing-instruction()

  • 離開身份單獨改造和添加模板<xsl:template match="text()"/>

實施例:

XML輸入

<Report> 
    <PaymentAccountInfo>  
     <AccountName>Demo Disbursement Account</AccountName> 
    </PaymentAccountInfo> 
</Report> 

XSLT 1.0

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

    <xsl:template match="@*|*"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|*"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML輸出

<Report> 
    <PaymentAccountInfo> 
     <AccountName/> 
    </PaymentAccountInfo> 
</Report>