XSLT & XPath: как наиболее эффективно изменить файл XML? - PullRequest
0 голосов
/ 04 февраля 2010

Я новичок в XSLT & XPath, поэтому, пожалуйста, прости меня за этот простой вопрос.

У меня есть следующий XML-файл:

<?xml version="1.0"?>
    <Configuration serviceName="Just Service" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
      <Page name="Books">
        <Instances count="5" />
        <ConfigurationSettings>
          <Setting name="index" value="true" />
          <Setting name="number" value="value1" />
          <Setting name="bookstorage" value="value2"/>
        </ConfigurationSettings>
      </Page>
      <Page name="Magazines">
        <Instances count="7" />
        <ConfigurationSettings>
          <Setting name="index" value="false" />
          <Setting name="number" value="value1" />
          <Setting name="magazinestorage" value="value3"/>
        </ConfigurationSettings>
      </Page>
    </Configuration>

Все, что я хочу, это изменить следующие значения ...

значение1 - для число (в двух местах); значение2 - для книжное хранилище ; значение3 - для магазина ;

... и до все остальное содержимое остается без изменений .

Для этого я хочу использовать msxsl.exe (утилита командной строки Microsoft). Не могли бы вы дать мне подсказку с примером таблицы стилей XSLT? Как наиболее эффективно обработать исходный XML-файл с помощью XSLT?

Спасибо, Rac

Ответы [ 3 ]

5 голосов
/ 04 февраля 2010

Способ сделать это в XSLT - использовать шаблон по умолчанию, который просто копирует содержимое документа, например:

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

Затем добавьте в таблицу стилей шаблоны, которые будут соответствовать конкретным узлам, которые вы хотите изменить. Эти узлы будут переопределять шаблон копирования по умолчанию выше, когда они совпадают. Например, если вы хотите, чтобы каждый числовой атрибут элемента Setting имел значение 314, вы бы добавили шаблон:

<xsl:template match="Setting/@number">
    <-- this copies in an attribute 'number' in place; with different contents -->
    <xsl:copy>314</xsl:copy>    
<xsl:template/>

Оба эти шаблона, а также любые другие с другими заменами, которые вы хотите сделать, будут в вашей таблице стилей в любом порядке

2 голосов
/ 04 февраля 2010

Вот пример таблицы стилей XSLT 1.0, которая принимает три параметра с новыми значениями:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:sc="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"
  exclude-result-prefixes="sc"
  version="1.0">

  <xsl:param name="p1" select="'foo'"/>
  <xsl:param name="p2" select="'bar'"/>
  <xsl:param name="p3" select="'foobar'"/>

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

  <xsl:template match="sc:Setting[@name = 'number']/@value">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="$p1"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="sc:Setting[@name = 'bookstorage']/@value">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="$p2"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template match="sc:Setting[@name = 'magazinestorage']/@value">
    <xsl:attribute name="{name()}">
      <xsl:value-of select="$p3"/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 04 февраля 2010

Я боюсь за этот вариант использования, и с помощью xslt будет проще создать новый документ с нуля. Или с вашим языком программирования вы можете прочитать дерево DOM и изменить только эти переменные (я мог бы показать это для Java, если необходимо).

В других случаях вы можете пропустить необработанный XML через обработку. Смотрите здесь для получения дополнительной информации.

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