Пара простых изменений XSLT - PullRequest
0 голосов
/ 03 июня 2011

Я новичок в XSLT, поэтому я считаю, что то, что я ищу, очень просто.

Я начинаю с некоторого XML, подобного этому:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <record>
    <id>10</id>
    <version>v1</version>
    <data>A Value</data>
  </record>
  <record>
    <id>12</id>
    <version>v2</version>
    <data>Another Value</data>
  </record>
</root>

Я хочу сделать 3 вещи с этим:

  • Фильтр, чтобы я мог видеть только результаты v2
  • Очистить <id>
  • Заменить "v2" на "v3"

Таким образом, результат должен быть:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <record>
    <id></id>
    <version>v3</version>
    <data>Another Value</data>
  </record>
</root>

Оригинальный XML - 9 МБ, но это дает идею.

Я выяснил, что такое фильтрация, но я не уверен, как применить несколько шаблонов к одним и тем же данным одновременно, как обнулить идентификатор и как добавить новое значение в <version> , Значение новой версии является просто статическим значением, поэтому оно очень прямолинейно.

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" 

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:output method="xml" />

  <xsl:template match="record">
     <xsl:if test="version='v2'">
        <xsl:copy-of select="." />
     </xsl:if>
  </xsl:template>

</xsl:stylesheet>

Ответы [ 3 ]

1 голос
/ 03 июня 2011

Можно ли удалить разрывы строк, сгенерированные из <xsl:value-of>?

Использование:

<data><xsl:value-of select="normalize-space(data)" /></data>
1 голос
/ 03 июня 2011

Этот шаблон будет выдавать требуемый результат из вашего входного XML:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:output method="xml" />

  <xsl:template match="root">
    <root>
    <xsl:apply-templates select="record[version = 'v2']" />
    </root>
  </xsl:template>

  <xsl:template match="record">
     <record>
       <id></id>
       <version>v3</version>
       <data><xsl:value-of select="data" /></data>
     </record>
  </xsl:template>

</xsl:stylesheet>

xsl:copy-of не подходит для той трансформации, которую вы хотите. (протестировано в этой веб-утилите).

0 голосов
/ 03 июня 2011

Вместо xsl:copy-of требуется преобразование личности с шаблонами, которые изменяют результаты:

<!-- Process only v2 records -->
<xsl:template match="root">
  <xsl:copy>
    <xsl:apply-templates select="record[version = 'v2']"/>
  </xsl:copy>
</xsl:template>

<!-- Change version -->
<xsl:template match="version">
  <xsl:copy>v3</xsl:copy>
</xsl:template>

<!-- Remove ID contents -->
<xsl:template match="id">
  <xsl:copy/>
</xsl:template>

<!-- Identity transformation -->
<xsl:template match="node() | @*">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*"/>
  </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...