我正在开发一个修改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?
谢谢。
答案 0 :(得分:1)
查看Identity Transform模板。基本上,它们迭代并复制xml中的每个元素(元素和属性等)。使用此选项,然后使用template match="..."
或if
条件块根据需要修改xml。例如:
<example>
<test>
<node attrName="oldAttrValue">oldNodeValue</node>
<node attrName="dontModify1">dontModify2</node>
</test>
</example>
<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>
<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)更准确地说:元素包含的每个文本范围都是可单独寻址的节点。