XML в XML xsl таблица стилей - PullRequest
3 голосов
/ 24 мая 2011

Мне было дано задание изучить использование xsl для обновления нескольких наших XML-документов на работе, и я искал некоторые учебные пособия по xsl, хотя я еще не натолкнулся на то, что в идеале я бы искал для ...

Поскольку я не на работе, вот небольшой пример того, что я ищу:

<?xml version="1.0" encoding="UTF-8"?>
<application>
    <id>627</id>
    <name>application1</name>
    <url>www.application.com</url>
</application>

Мне нужно преобразовать это в:

<?xml version="1.0" encoding="UTF-8"?>
<application>
    <id>627</id>
    <application_name>application1</application_name>
    <url>www.application.com</url>
</application>

Теперь из примеров и учебных пособий, которые я видел, я мог бы сделать это с помощью жестко закодированного листа xsl, выглядящего так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output method="xml" encoding="UTF-8"/>
    <xsl:template match="/">
        <application>
        <xsl:apply-templates/>
        </application>
    </xsl:template> 
    <xsl:template match="id">
        <id>
        <xsl:value-of select="id"/>
        <xsl:apply-templates/>
        </id>
     </xsl:template>
     <xsl:template match="name">
        <application_name>
        <xsl:value-of select="name"/>
        <xsl:apply-templates/>
        </application_name>
     </xsl:template>
     <xsl:template match="url">
        <url>
        <xsl:value-of select="url"/>
        <xsl:apply-templates/>
        </url>
     </xsl:template>
</xsl:stylesheet>

Но на самом деле это не будет практично, поскольку у нас есть около 50 различных XML-документов, которые могут нуждаться в изменении, и поэтому я действительно искал шаблон перехвата всех, который мог бы использовать, а затем переопределял только соответствующий элемент, который необходимо изменить. .

Существует ли эта функция в xsl?

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Дайте мне посмотреть, понимаю ли я, что вам нужно.Первое шаблонное правило в приведенном ниже преобразовании называется Идентификационное преобразование обрабатывает все узлы путем их копирования и может быть переопределено для отдельных элементов, атрибутов, комментариев, инструкций по обработке или текстовых узлов.В вашем случае, я только что переопределил элемент name.


XSLT 1.0 , протестированный в Saxon 6.5.5

<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()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="name">
        <xsl:variable name="parent" select="name(parent::*[1])"/>
        <xsl:variable name="node" select="local-name()"/>
        <xsl:element name="{$parent}_{$node}">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

Применяется к этому входу:

<?xml version="1.0" encoding="UTF-8"?>
<anyapplication>
    <id>627</id>
    <name>application1</name>
    <url>www.application.com</url>
</anyapplication>

Производит:

<?xml version="1.0" encoding="UTF-8"?>
<anyapplication>
    <id>627</id>
    <anyapplication_name>application1</anyapplication_name>
    <url>www.application.com</url>
</anyapplication>
0 голосов
/ 24 мая 2011

Вы можете попробовать что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
     <xsl:template match="name">
        <application_name>
        <xsl:value-of select="name"/>
        <xsl:apply-templates/>
        </application_name>
     </xsl:template>
     <xsl:template match="not(name)">
        <xsl:copy-of select="."/>
        <xsl:apply-templates/>
     </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...