我有一个以下的xml文档:
<xjdf:XJDF>
<xjdf:AuditPool>
<xjdf:Created TimeStamp="2013-09-03T12:07:16+02:00">
<xjdf:Employee PersonalID="j.smith" Roles="Operator"/>
</xjdf:Created>
</xjdf:AuditPool>
</xjdf:XJDF>
在本文档中,我想将xjdf:Created元素的TimeStamp属性的值更改为空,如TimeStamp =&#34;&#34;。我怎么能用xsl做到这一点?我试过以下:
<xsl:template match="//xjdf:XJDF/xjdf:AuditPool/xjdf:Created/@TimeStamp">
<xsl:attribute name="TimeStamp"/>
</xsl:template>
但没有成功。
答案 0 :(得分:1)
您没有以正确的方式使用xsl:attribute,您必须始终输入一个输出元素声明(或者您提供给我们的XSL中缺少某些内容)。此外,您不需要为该属性设置任何新值。
这样的事情应该有效
<xsl:template match="//xjdf:XJDF/xjdf:AuditPool/xjdf:Created">
<xjdf:Created>
<xsl:attribute name="TimeStamp">
(...the new attribute value here...)
</xsl:attribute>
<xsl:attribute name=" other_attribute ">
(...the other attribute value here...)
</xsl:attribute>
<xsl:apply-templates />
</xjdf:Created>
</xsl:template>
答案 1 :(得分:0)
您的模板将做正确的事情,但只有当有另一个模板(例如身份模板)导致它被应用时 - 由于默认模板规则永远不会将模板应用于属性节点。这是一个基于身份的例子
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:xjdf="urn:example-com:xjdf"> <!-- replace URI as appropriate -->
<!-- identity template - copy everything as-is except where overridden -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<!-- clear TimeStamp attribute -->
<xsl:template match="xjdf:XJDF/xjdf:AuditPool/xjdf:Created/@TimeStamp">
<xsl:attribute name="TimeStamp"/>
</xsl:template>
</xsl:stylesheet>
请注意,您不需要匹配模式中的前导//
,并且根据XML文档其余部分的结构,您可能不需要所有四个层次结构 - 只需{{1 }或match="@TimeStamp"
可能足够精确。如果要更改其他属性,只需添加与其匹配的其他模板,但如果要将 new 属性添加到输入中没有的元素,则需要编写一个与元素本身匹配的模板,例如
match="xjdf:Created/@TimeStamp"