-2

我需要能够复制 xml 中的节点,而不是数据本身。

例子:

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

这需要只是

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

谢谢!

4

4 回答 4

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()"

于 2013-06-26T14:09:54.890 回答
0

如果要从所有元素中删除文本内容,可以通过替换为来修改身份转换node()*

不过,这也将删除注释和处理指令,因此:

  • 添加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>
于 2013-06-26T19:49:17.130 回答
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>
于 2013-06-26T14:05:03.917 回答
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>
于 2013-06-26T16:11:51.577 回答