使用xsl修改xml节点值或属性值而不指定

时间:2015-07-01 23:15:44

标签: xml xslt

我正在开发一个修改xml文档的项目。我想修改节点值或属性值。如果我指定它是我想要修改的节点或属性值,我就能做到这一点。 修改xsl中的节点值:

<xsl:template match="XPath/text()">newValue</xsl:template>

修改xsl中的属性值:

<xsl:template match="XPath">
  <xsl:attribute name="attributeName">newValue</xsl:attribute>
</xsl:template>

但我想修改值而不指定它是节点或属性。例如,这是一个简短的xml:

<example>
  <test>
    <node attrName="oldAttrValue">
      oldNodeValue
    </node>
  </test>
</example>

我想修改“attrName”属性值或“node”节点值而不指定哪个。这可能是某种可能的,也许来自XPath?

谢谢。

2 个答案:

答案 0 :(得分:1)

查看Identity Transform模板。基本上,它们迭代并复制xml中的每个元素(元素和属性等)。使用此选项,然后使用template match="..."if条件块根据需要修改xml。例如:

源XML

<example>
  <test>
    <node attrName="oldAttrValue">oldNodeValue</node>
    <node attrName="dontModify1">dontModify2</node>
  </test>
</example>

XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- identity transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <!-- modify specific text() nodes -->
  <xsl:template match="text()[.='oldNodeValue']">
    <xsl:text>newElementValue</xsl:text>
  </xsl:template>
  <!-- modify specific attribute nodes -->
  <xsl:template match="@*[.='oldAttrValue']">
    <xsl:attribute name="{name()}">newAttributeValue</xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

输出XML

<example>
  <test>
    <node attrname="newAttributeValue">newElementValue</node>
    <node attrname="dontModify1">dontModify2</node>
  </test>
</example>

如果您不想指定要匹配的属性/元素值(即您希望将转换应用于具有非空值的所有属性/元素值),请简单地替换text()[.='oldNodeValue']和{{ 1}}分别与@*[.='oldAttrValue']text()[normalize-space(.)!='']匹配。

答案 1 :(得分:1)

  

我想修改“attrName”属性值或“节点”   节点值,不指定哪个。这是不可能的

如果我正确理解你的问题(这完全不确定)答案是肯定的。

请注意,元素中包含的文字是 1 节点,因此可以选择XPath表达式或由模板的匹配模式匹配。 属性也是节点 - 但属性的值不是 - 因此无法单独选择或匹配。

另请参阅:http://www.w3.org/TR/xpath/#data-model

-
(1)更准确地说:元素包含的每个文本范围都是可单独寻址的节点