XSLT: можно ли обновить значение в узле xml с помощью xslt? - PullRequest
5 голосов
/ 18 марта 2011

Например, у меня есть 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 ]

8 голосов
/ 18 марта 2011

Это преобразование :

<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 (параметры встраивается в таблицу стилей XSLT).

  3. В этом случае атрибут создается заново (не копируется) с тем же именем и с новым значением, указанным в соответствующем элементе repAttr (его атрибут value).

3 голосов
/ 18 марта 2011

Я не могу "обновить" входной 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...