XSLT с пространствами имен: в шаблоне копирования отсутствуют атрибуты - PullRequest
1 голос
/ 16 февраля 2012

Применение стандартного шаблона копирования XSLT,

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

до JBoss AS 7 standalone.xml , приводит к потере параметров:

<?xml version="1.0" encoding="UTF-8"?><server xmlns="urn:jboss:domain:1.1">
    <extensions>
        <extension/>
        <extension/>

вместо

<?xml version="1.0" encoding="UTF-8"?><server xmlns="urn:jboss:domain:1.1">
    <extensions>
        <extension module="org.jboss.as.clustering.infinispan"/>
        <extension module="org.jboss.as.configadmin"/>

Почему? Как я могу сделать это копировать все?

Преобразование XSLT выполняется плагином Maven XML. Весь шаблон:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:ds="urn:jboss:domain:datasources:1.0"
            xmlns="urn:jboss:domain:1.1"
            version="1.0">
    <xsl:output method="xml" indent="yes"/>

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

</xsl:stylesheet>

1 Ответ

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

Ваш шаблон работает правильно.

Я изменил его и XML, чтобы показать, что он работает:

<?xml version="1.0" encoding="UTF-8"?>
<server xmlns="urn:jboss:domain:1.1">
  <extensions>
    <extension module="org.jboss.as.clustering.infinispan"/>
    <extension module="org.jboss.as.configadmin"/>
  </extensions>
</server>

Запустите с этим XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ds="urn:jboss:domain:datasources:1.0"
                xmlns:so="urn:jboss:domain:1.1"
                version="1.0">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="*|@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="*|@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="so:extension">
    <xsl:copy>
    <xsl:attribute name="testing">just for fun!!</xsl:attribute>
    <xsl:copy-of select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Производит:

<?xml version="1.0"?>
<server xmlns="urn:jboss:domain:1.1">
  <extensions>
    <extension testing="just for fun!!" module="org.jboss.as.clustering.infinispan"/>
    <extension testing="just for fun!!" module="org.jboss.as.configadmin"/>
  </extensions>
</server>

Вот вывод, выполненный с вашим исходным XSL:

<?xml version="1.0"?>
<server xmlns="urn:jboss:domain:1.1">
  <extensions>
    <extension module="org.jboss.as.clustering.infinispan"/>
    <extension module="org.jboss.as.configadmin"/>
  </extensions>
</server>

Я скачал полный JBoss standalone.xml, запустил ваш XSL, и вот разницаXML ввода и вывода:

so zacharyyoung$ xsltproc so.xsl so.xml > output.xml
so zacharyyoung$ diff so.xml output.xml
1,2c1
< <?xml version='1.0' encoding='UTF-8'?>
< 
---
> <?xml version="1.0"?>
...