通过 xsl 更改 xml 属性的值

Change xml attribute's value via xsl

我有以下 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=""。我如何使用 xsl 执行此操作?我试过以下:

<xsl:template match="//xjdf:XJDF/xjdf:AuditPool/xjdf:Created/@TimeStamp">
    <xsl:attribute name="TimeStamp"/>
</xsl:template>

但没有成功。

您没有以正确的方式使用 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>

您的模板将做正确的事情,但前提是有另一个模板(例如身份模板)导致它被应用 - 它自己不会触发,因为默认模板规则从不将模板应用到属性节点。这是一个基于身份的示例

<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 文档其余部分的结构,您可能不需要所有四个级别的层次结构 -简单地 match="@TimeStamp"match="xjdf:Created/@TimeStamp" 可能就足够精确了。如果你想改变其他属性,你可以简单地添加额外的模板来匹配那些,但是如果你想添加 new 属性到输入中不存在的元素,那么你将需要编写一个匹配元素本身的模板,例如

<xsl:template match="xjdf:Created">
  <xjdf:Created newAttribute="newValue">
    <xsl:apply-templates select="@*|node()" />
  </xjdf:Created>
</xsl:template>