2013-07-02 49 views
1

當我複製一個XML節點時,如何複製所有屬性並將它們設置爲相同的值?如何複製所有屬性並在複製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

對於屬性,您可以使用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> 
相關問題