通过 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>
我有以下 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>