Изменить узел XML, используя [MS] XSLT Script - PullRequest
1 голос
/ 13 сентября 2009

Я хотел бы выбрать узел и изменить его атрибуты и дочерние узлы, используя xsl: функция скрипта. Кроме того, шаблоны, соответствующие дочерним узлам этого узла, должны ЕЩЕ выполняйте свою работу (после того, как скрипт завершит обработку узла).

  1. Можно ли это сделать с помощью XSLT?
  2. Не могли бы вы привести пример / скелет для такого преобразования?

1 Ответ

1 голос
/ 13 сентября 2009

Да, это можно сделать. Я не вижу, в чем проблема, потому что XML (или любой другой вывод) XSL-скрипта буферизуется независимо от его ввода.

Это показано в следующем примере, в котором простой XSL-скрипт копирует входной XML-документ в основном как есть, изменяя несколько вещей:

  • имя корневого элемента и атрибут
  • Сглаживание путем удаления элемента из иерархии
  • удаление элемента результатов / даты
  • переименование элемента 'источник' атрибут 'происхождение'
  • изменить значение атрибута элемента 'level'
  • переименование элементов FirstName и LastName элементов item

Пример ввода

<?xml version="1.0" encoding="ISO-8859-1"?>
<MyRoot version="1.2">
    <results>
        <info>Alpha Bravo</info>
        <author>Employee No 321</author>
        <date/>
        <item source="www" level="6" cost="33">
            <FirstName>Jack</FirstName>
            <LastName>Frost</LastName>
            <Date>1998-10-30</Date>
            <Organization>Lemon growers association</Organization>
         </item>
         <item source="db-11" level="1" cost="65" qry="routine 21">
            <FirstName>Mike</FirstName>
            <LastName>Black</LastName>
            <Date>2006-10-30</Date>
            <Organization>Ford Motor Company</Organization>
         </item>
    </results>
</MyRoot>

Объем производства

<?xml version="1.0" encoding="utf-16"?>
<MyNewRoot version="0.1">
    <author>Employee No 321</author>
    <info>Alpha Bravo</info>
    <item cost="33" origin="www" level="77">
        <GivenName>Jack</GivenName>
        <FamilyName>Frost</FamilyName>
        <Date>1998-10-30</Date>
        <Organization>Lemon growers association</Organization>
    </item>
    <item cost="65" qry="routine 21" origin="db-11" level="77">
        <GivenName>Mike</GivenName>
        <FamilyName>Black</FamilyName>
        <Date>2006-10-30</Date>
        <Organization>Ford Motor Company</Organization>
    </item>
</MyNewRoot>

XSL-скрипт

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  exclude-result-prefixes="#default">

<xsl:template match="MyRoot">
   <xsl:call-template name="MainTemplate">
   </xsl:call-template>
</xsl:template>

<xsl:template name="MainTemplate">
   <MyNewRoot version="0.1">

   <xsl:copy-of select="results/author" />
   <xsl:copy-of select="results/info" />

   <xsl:for-each select="results/item">
      <xsl:call-template name="FixItemElement"/>
   </xsl:for-each>

  </MyNewRoot> 
</xsl:template>

<xsl:template name="FixItemElement">
    <xsl:copy>
        <xsl:copy-of select="@*[not(name()='source' or name()='level')]" />
        <xsl:attribute name="origin">
            <xsl:value-of select="@source"/>
        </xsl:attribute>
        <xsl:attribute name="level">
            <xsl:value-of select="77"/>
        </xsl:attribute>

        <xsl:for-each select="descendant::*">
          <xsl:choose>
            <xsl:when test="local-name(.) = 'FirstName'">
                <GivenName>
                   <xsl:value-of select="."/>
                </GivenName>
            </xsl:when>
            <xsl:when test="local-name(.) = 'LastName'">
                 <FamilyName>
                   <xsl:value-of select="."/>
                </FamilyName>
            </xsl:when>
            <xsl:otherwise>
              <xsl:copy>
                 <xsl:apply-templates select="@*|node()"/>
              </xsl:copy>
            </xsl:otherwise>
          </xsl:choose>       
        </xsl:for-each>       
    </xsl:copy>
</xsl:template> 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...