2015-11-17 2 views
0

Вот мой XSLT:Remove пространства имен XML при копировании с помощью XSLT

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:urn="urn:jboss:domain:3.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="//urn:socket-binding-group"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
      <urn:socket-binding name="https" port="${{jboss.https.port:8443}}"/> 
     </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 

Я хочу, чтобы преобразовать этот XML-файл:

<server xmlns="urn:jboss:domain:3.0"> 
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> 
     <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/> 
    </socket-binding-group> 
</server> 

быть похожим:

<server xmlns="urn:jboss:domain:3.0"> 
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> 
     <socket-binding name="https" port="${jboss.https.port:8443}"/> 
     <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/> 
    </socket-binding-group> 
</server> 

Но результат преобразования:

<server xmlns="urn:jboss:domain:3.0"> 
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> 
     <urn:socket-binding xmlns:urn="urn:jboss:domain:3.0" name="https" port="${jboss.https.port:8443}"/> 
     <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/> 
    </socket-binding-group> 
</server> 

У него есть дополнительный атрибут xmlns. Любая идея, как я могу это исправить?

ответ

2

Существует лишь небольшое изменение в декларации пространства имен и здесь модифицированный XSLT

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns="urn:jboss:domain:3.0"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="//*:socket-binding-group"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
      <socket-binding name="https" port="${{jboss.https.port:8443}}"/> 
     </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 
+0

Спасибо. Но могу ли я узнать причину? – user1079877

+0

Как упоминалось, используя пространство имен по умолчанию. Изменено из 'xmlns: urn =" urn: jboss: domain: 3.0 "' to 'xmlns =" ​​urn: jboss: domain: 3.0 "', что позволяет избежать этого явного пространства имен. Также незначительные изменения от '' to ''. И измените из '' to '<имя сокета-связывания =" https "port =" $ { {jboss.https.port: 8443}} "/>' – Rao

+0

Главное, что для литеральных элементов результата в таблице стилей (например, сокет-привязка) привязки пространства имен в пространстве (оба префикса и URI) копируются из таблицы стилей , Если вы используете xsl: copy для создания элемента с привязкой пространства имен (p1 = uri1) и используйте литеральный результирующий элемент для создания элемента с привязкой пространства имен (p2 = uri1), тогда вы получите документ результата, который имеет два префикса пространства имен p1 и p2, оба связанные с тем же URI uri1. –