XSLT,复制节点但不是节点中的数据

时间:2013-06-26 13:39:17

标签: xml xslt

我需要能够在xml中复制节点,但不能复制数据本身。

示例:

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

这需要只是

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

谢谢!

4 个答案:

答案 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>

答案 1 :(得分:0)

  

只是复制所有xml节点的常用方法。只有选择apply-templates为'node()'才

所以你当前的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内的节点(这也会删除缩进,因为它会压缩只有空白的节点),只需使用{{1}而不是match="text()"

答案 2 :(得分: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>

答案 3 :(得分: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>