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

时间:2011-03-18 11:02:55

标签: 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>

可以将“Basic XML”一书的名称更新为“Basic XSLT”,还是使用XSLT更改任何节点的任何其他属性?如果是的话,有人能给我一些如何做的例子吗?

提前致谢。

2 个答案:

答案 0 :(得分:8)

此转化

<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>

应用于提供的XML文档时:

<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>

<强>解释

  1. 身份规则/模板“按原样”复制每个节点。

  2. 标识模板由匹配任何属性的单个模板覆盖,该属性的名称可以作为name元素的repAttr属性之一的值找到my:reps元素的值repAttr 1}}元素(嵌入在XSLT样式表中的参数)。

  3. 在这种情况下,将重新创建(不复制)具有相同名称和新值的属性,该值在相应的value元素(其{{1}}属性)中指定。 / p>

答案 1 :(得分:3)

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

你可以制作一个几乎相同的副本但是@Oded评论指出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>