复制xml节点时,如何复制所有属性并将它们设置为相同的新值?

时间:2013-07-02 03:56:24

标签: xml xslt

复制xml节点时,如何复制所有属性并将它们设置为相同的值?

给出一个xml:

<schedule>
    <owner>
        <name>
            <first>Eric</first>
        </name>
    </owner>
    <appointment>
        <when>
            <date month="03" day="15" year="2001"/>
        </when>
        <subject>Interview potential new hire</subject>
    </appointment>
</schedule>

转型后我想得到的是:

    <schedule>
        <owner>
            <name>
                <first>?</first>
            </name>
        </owner>
        <appointment>
            <when>
                <date month="?" day="?" year="?"/>
            </when>
            <subject>?</subject>
        </appointment>
   </schedule>

这就是我所管理的:

 <xsl:template match="*|@*">
        <xsl:copy>
                <xsl:if test="node() and not(*)">
                    <xsl:text>?</xsl:text>
                </xsl:if>
                <xsl:if test="not(node())">
                    <xsl:attribute name="???">?</xsl:attribute>
                </xsl:if>
                <xsl:apply-templates select="*|@*" />
            </xsl:copy>
        </xsl:template>

    </xsl:stylesheet>

这些不起作用:

<xsl:attribute name="name(.)">?</xsl:attribute> 
<xsl:attribute name="@*">?</xsl:attribute>
<xsl:attribute name="*">?</xsl:attribute>
<xsl:attribute name=".">?</xsl:attribute>       

<xsl:if test="not(node())">
     <xsl:text>?</xsl:text>
</xsl:if>

<xsl:if test="not(node())">
     ?
</xsl:if>

属性名称是否总是期望静态值? 在xslt中有解决方法吗?

1 个答案:

答案 0 :(得分:1)

对于某个属性,您可以使用name()(或local-name())重新构建该属性。

示例:

XML输入

<schedule>
    <owner>
        <name>
            <first>Eric</first>
        </name>
    </owner>
    <appointment>
        <when>
            <date month="03" day="15" year="2001"/>
        </when>
        <subject>Interview potential new hire</subject>
    </appointment>
</schedule>

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="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*" priority="1">
        <xsl:attribute name="{name()}">
            <xsl:text>?</xsl:text>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="text()" priority="1">
        <xsl:text>?</xsl:text>
    </xsl:template>

</xsl:stylesheet>

XML输出

<schedule>
   <owner>
      <name>
         <first>?</first>
      </name>
   </owner>
   <appointment>
      <when>
         <date month="?" day="?" year="?"/>
      </when>
      <subject>?</subject>
   </appointment>
</schedule>