XSL: копировать XML, а затем заменить некоторые теги - PullRequest
5 голосов
/ 04 октября 2011

Я очень новичок в XSL / XSLT.Я хочу скопировать XML-документ в другой, но заменить некоторые теги с пространством имен и некоторые теги, которые имеют некоторые специальные атрибуты.Например:

<root>
  <ext:foo>Test</ext:foo>
  <bar>Bar</bar>
  <baz id="baz" x="test">
    <something/>
  </baz>
</root>

Следует переписать в:

<root>
  --Test--
  <bar>Bar</bar>
  xxx<baz id="baz">
    <something/>
  </baz>xxx
</root>

Можно ли скопировать весь XML, а затем применить некоторые правила для замены тегов, которые я хочу заменить?

Ответы [ 2 ]

6 голосов
/ 04 октября 2011

Вы можете скопировать некоторые узлы и переписать другие с другими правилами. Чтобы сохранить <root> и <bar> одинаковыми и переписать <baz>, попробуйте это (не проверено) в качестве отправной точки:

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

  <!-- Match <baz> and re-write a little -->
  <xsl:template match="baz">
    xxx<baz id="{@id}">
     <xsl:apply-templates />
    </baz>xxx
  </xsl:template>

  <!-- By default, copy all elements, attributes, and text -->
  <xsl:template match="@* | node()">
<xsl:copy>
  <xsl:apply-templates select="@* | node()"/>
</xsl:copy>
  </xsl:template>


</xsl:stylesheet>
0 голосов
/ 04 октября 2011

Предполагая, что ваш файл .xml имеет то же пространство имен для ext: xmlns: ext = "www.foo.com", этот xslt создает ваш вывод, хотя вы должны воспринимать его с недолгой солью, поскольку он точно не проверяет что-нибудь, просто производит ваш вывод для этого конкретного случая.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ext="www.foo.com">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/root">
    <root>

      <xsl:text>--</xsl:text><xsl:value-of select="./ext:foo/text()"/><xsl:text>--</xsl:text>
      <xsl:copy-of select="./bar"/>
      <xsl:variable name="bazElem" select="./baz"/>
      <xsl:text>xxx</xsl:text><baz id="{$bazElem/@id}">
        <xsl:copy-of select="$bazElem/something"/>
      </baz><xsl:text>xxx</xsl:text>
    </root>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...