XSLT требуется очень простое преобразование - PullRequest
1 голос
/ 22 февраля 2012

У меня есть требование для запуска преобразования в XML-файл.это будет очень просто, но я никогда не делал xslt-работу, пока я немного не растерялся.У меня было очень много вопросов и ответов, но я не смог решить это?

Что мне требуется, так это то, что мой xml-файл имеет ссылку на схему, и мне нужно изменить ее на другую ссылку на схему.

<?xml version="1.0" encoding="UTF-8"?>
<Schedule xmlns="http://www.xxx.com/12022012/schedule/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xxx.com/12022012/schedule/v2 ../Schema/Schema_v2.xsd">
  <Interface_Header>
  </Interface_Header>
...
</Schedule>

Я просто хочу изменить V2 на V3 и сохранитьостальная часть файла не повреждена?Это звучит очень просто, но я не могу понять это?Я попробовал простой xslt здесь: -

<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:stylesheet>

, но с использованием этого выводит все мои значения без каких-либо тегов xml.

спасибо в Adv.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2012

Если вам не нужно, чтобы в новом расположении схемы было пространство имен xsi, сработает следующее:

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

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

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

<xsl:template match="@*[local-name() = 'schemaLocation']">
    <xsl:attribute name="schemaLocation">newSchemaLocation</xsl:attribute>
</xsl:template>

Когда вам снова понадобится пространство имен xsi, тогда, конечно, нужнобыть упомянутым в шаблонах и, таким образом, должно быть объявлено в заголовке таблицы стилей, как показано ниже, где в качестве демонстрации также функция local-name () заменена функцией name ();первый включает пространство имен, где последнее не имеет:

<xsl:stylesheet 
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

...

    <xsl:template match="@*[name() = 'xsi:schemaLocation']">
        <xsl:attribute name="xsi:schemaLocation">newSchemaLocation</xsl:attribute>
    </xsl:template>

</xsl:stylesheet>

Обратите внимание, что оба решения полагаются на конкретные пути к шаблонам (@*[local-name()=...]), чтобы иметь более высокий приоритет, чем менее конкретные (@*).

0 голосов
/ 22 февраля 2012

Использование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:ns="new_namespace">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@xsi:schemaLocation">
        <xsl:attribute name="xsi:schemaLocation">
            <xsl:text>new_schema_location</xsl:text>
        </xsl:attribute>
    </xsl:template>

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

    <xsl:template match="*">
        <xsl:element name="{local-name()}" namespace="ns">
            <xsl:apply-templates select="node() | @*"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

применительно к предоставленному XML производит

<Schedule xsi:schemaLocation="new_schema_location" xmlns="ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Interface_Header>
    </Interface_Header>
    ...
</Schedule>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...