1

复制 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 中有解决方法吗?

4

1 回答 1

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>
于 2013-07-02T04:09:45.803 回答