скопировать XML-документ с атрибутами - PullRequest
2 голосов
/ 28 февраля 2012

Я пытаюсь скопировать XML-документ с атрибутами и узлами. Вывод не содержит атрибутов. fi.xml - это ввод, test.xsl выполняет преобразование (в xsl требуется режим). Спасибо.

f1.xml
<test attr="val">
  <subtest attr2="val2"/>
</test>

test.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates select="document('f1.xml')" mode="abc"/>
    </xsl:copy>
  </xsl:template>

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

output:
<?xml version="1.0" encoding="UTF-8"?><test>
  <subtest/>
</test>

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

Самое короткое решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="document('f1.xml')"/>
 </xsl:template>
</xsl:stylesheet>

Более гибкое решение, но более простое (без режимов) и более стандартное :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="/">
  <xsl:apply-templates select=
       "document('f1.xml')/node()"/>
 </xsl:template>
</xsl:stylesheet>

Объяснение : Соответствующее применение правила идентификации к дочерним узлам документа document('f1.xml')

2 голосов
/ 28 февраля 2012

Эта таблица стилей кажется очень странной, но попробуйте изменить xsl:apply-templates на:

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