XSLT:我可以使用XSLT更新xml节点中的值吗?

XSLT:我可以使用XSLT更新xml节点中的值吗?,xml,xslt,Xml,Xslt,例如,我有一个类似xml的 <books> <book id="1"> <title id="11" name="Basic XML"/> <price id="12" amount="500"/> <quantity id="13" number="10"/> </book> </books> 可以使用XSLT将书的基本XML名称更新为基本XSLT,或者更改任何节

例如,我有一个类似xml的

 <books>
   <book id="1">
     <title id="11" name="Basic XML"/>
     <price id="12" amount="500"/>
     <quantity id="13" number="10"/>
   </book>
 </books>
可以使用XSLT将书的基本XML名称更新为基本XSLT,或者更改任何节点的任何其他属性吗?如果是的话,谁能给我举一些例子说明如何做


提前感谢。

我无法更新输入Xml,因为XSLT纯粹是一种输出驱动技术。它将创建一个新文档,并且无法修改现有文档

您可以制作一个几乎相同的副本,但正如@Oded comment指出的那样,XSLT可能有点过头了。xsl看起来有点像修改过的标识转换

<xsl:stylesheet version="1.0">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
   <xsl:template match="title/@Name">
     <!-- insert logic here to change the value as appropriate -->
   </xsl:template>
</xsl:stylesheet>
这一转变:

应用于提供的XML文档时:

生成所需的正确结果:

说明:

标识规则/模板按原样复制每个节点

标识模板由单个模板覆盖,该模板与任何属性匹配,这些属性的名称可以作为嵌入XSLT样式表的my:reps元素参数中指定的repAttr元素的名称属性之一的值找到

在这种情况下,将重新创建属性,而不是使用相同的名称和在相应的repAttr元素及其value属性中指定的新值进行复制


XSLT被用来将XML文件转换成不同的格式——听起来像是对你想要的东西的过度使用。好问题,+1。请参阅我的答案,以获得一个完整、简短且简单的解决方案,该解决方案基于最基本的XSLT设计模式—身份规则/模板的使用和覆盖。还提供了广泛的解释。@sprenna:这是可能的,因为@Dimitre的回答显示。。。但我同意@Oded:对于值替换,我将使用XPath选择节点并使用适当的DOM方法。@Alejandro:eeeeww@迪米特里:最好的方法实际上取决于更新的意义。如果这意味着获取一个XML并序列化其他XML文档,比如说。。。命令行,我将使用XSLT。但如果这更一般,比如数据库问题、javascript DOM或任何嵌入式环境,在这些环境中,您或XSLT处理器必须调用解析器,执行更新,然后序列化,那么我将使用XPath选择和DOM更新。当然,比值替换更复杂的过程肯定需要XSLT或XQuery
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:reps>
  <repAttr name="name" value="Basic XSLT"/>
  <repAttr name="amount" value="300"/>
  <repAttr name="number" value="20"/>
 </my:reps>

 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match=
   "@*[name()=document('')/*/my:reps/*/@name]">

   <xsl:attribute name="{name()}">
    <xsl:value-of select=
    "document('')/*/my:reps/*[@name=name(current())]/@value"/>
   </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>
<books>
    <book id="1">
        <title id="11" name="Basic XML"/>
        <price id="12" amount="500"/>
        <quantity id="13" number="10"/>
    </book>
</books>
<books>
   <book id="1">
      <title id="11" name="Basic XSLT"/>
      <price id="12" amount="300"/>
      <quantity id="13" number="20"/>
   </book>
</books>