Как преобразовать определенный атрибут в элемент - PullRequest
3 голосов
/ 03 января 2012

Мне нужно преобразовать определенный атрибут XML в элемент XML.Входной XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<filter query="select" name="some name"/>

Вывод моего желания выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
    <filter name="some name">
    <query>select</query>
</filter>

Я использую следующий XSLT:

<?xml version="1.0" encoding="UTF-8"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"      xmlns="http://www.w3.org/1999/xhtml">
   <xsl:strip-space elements="*"/>
   <xsl:output indent="yes"/>

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

   <xsl:template match="/filter/@query">
        <xsl:element name="{name(.)}">
            <xsl:value-of select="."/>
        </xsl:element>
   </xsl:template>
</xsl:stylesheet>

Однако, когда я применяюэтот XSLT к предоставленному примеру атрибут имени исчезает:

<?xml version="1.0" encoding="UTF-8"?>
<filter>
    <query>select</query>
</filter>

Если я изменяю порядок атрибутов, т.е. ставлю «имя» перед «запросом», все работает отлично.Я пытаюсь решить это, но мои знания XSLT очень ограничены.Пожалуйста помоги.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Это должно дать вам необходимый вывод:

<?xml version="1.0" encoding="UTF-8"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:strip-space elements="*"/>
   <xsl:output indent="yes"/>

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

   <!-- match the filter element -->
   <xsl:template match="filter">
     <!-- output a filter element -->
     <xsl:element name="filter">
       <!-- add the name attribute, using the source name attribute value -->
       <xsl:attribute name="name">
         <xsl:value-of select="@name"/>
       </xsl:attribute>
       <!-- add the query child element, using the source query attribute value -->
       <xsl:element name="query">
         <xsl:value-of select="@query"/>
       </xsl:element>
     </xsl:element>
   </xsl:template>

</xsl:stylesheet>
1 голос
/ 03 января 2012

Это может быть намного короче:

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*[not(name()='query')]"/>
     <query><xsl:value-of select="@query"/></query>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу:

<filter query="select" name="some name"/>

желаемый, правильный вывод:

<filter name="some name">
   <query>select</query>
</filter>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...