通过xsl更改xml属性的值

时间:2015-01-09 10:24:32

标签: xml xslt

我有一个以下的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>

但没有成功。

2 个答案:

答案 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"
相关问题