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