Я искал в Интернете инструмент для этого, но я не нашел его, поэтому я думал, что его должно быть просто создать. Я хочу создать XSLT, где я ввожу произвольный файл xml, и он выведет оператор select, который я могу использовать внутри базы данных Oracle для генерации входного xml.Использование XSLT для создания оператора PLSQL для вывода XML
E.g. Если я даю ему:
<?xml version="1.0"?>
<test xmlns="dddd" xmlns:xxx="ddd222" someatt="val">
<xxx:f>E</xxx:f>
<g>G</g>
<h xmlns="anotherns">H</h>
<zz:i xmlns:zz="yetanotherns">I</zz:i>
</test>
Я хочу следующий вывод:
select
xmlelement("test"
,xmlattributes(
'dddd' as "xmlns"
,'ddd222' as "xmlns:xxx"
,'val' as "someatt"
)
,xmlelement("xxx:f",'E')
,xmlelement("g",'G')
,xmlelement("h"
,xmlattributes('anotherns' as "xmlns")
,'H'
)
,xmlelement("zz:i"
,xmlattributes('yetanotherns' as "xmlns:zz")
,'I'
)
)
from dual;
Я почти всю дорогу. Я могу сделать следующий вывод с моим текущим XSLT:
select
xmlelement("test"
,xmlattributes(
'val' as "someatt"
)
,xmlelement("xxx:f",'E')
,xmlelement("g",'G')
,xmlelement("h",'H')
,xmlelement("zz:i",'I')
)
from dual;
Это прекрасно, за исключением того, что отсутствуют атрибуты xmlns. Проблема заключается в том, что атрибуты xmlns и xmlns: *** во входном документе не рассматриваются как обычные атрибуты и не кажутся видимыми при запуске xslt. Есть ли опция, чтобы они оставались?
XSLT У меня есть ниже:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
>
<xsl:output method="text" indent="no" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:text>select
</xsl:text>
<xsl:apply-templates/>
<xsl:text>
from dual;</xsl:text>
</xsl:template>
<xsl:template match="node()">
<xsl:text>xmlelement("</xsl:text>
<xsl:value-of select='name()'/>
<xsl:text>"</xsl:text>
<!--Lots of tabs for indenting-->
<xsl:variable name='tabs' xml:space="preserve"> </xsl:variable>
<xsl:variable name='nl'><xsl:text>
</xsl:text><xsl:value-of select='substring($tabs,0,count(ancestor::*)+2)'/></xsl:variable>
<xsl:variable name='att_children' select='count(@*)'/>
<xsl:if test="$att_children > 0">
<xsl:value-of select="$nl"/>
<xsl:text>,xmlattributes(</xsl:text>
<xsl:for-each select='./@*'>
<xsl:value-of select="$nl"/><xsl:text> </xsl:text>
<xsl:if test="position() > 1"><xsl:text>,</xsl:text></xsl:if>
<xsl:text>'</xsl:text>
<xsl:value-of select="."/>
<xsl:text>' as "</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:value-of select="$nl"/>
<xsl:text>)</xsl:text>
</xsl:if>
<xsl:variable name='children' select='count(*)'/>
<!--<xsl:value-of select='$children'/>-->
<xsl:choose>
<xsl:when test='$children=0'>
<xsl:text>,</xsl:text>
<xsl:text>'</xsl:text>
<xsl:value-of select='text()'/>
<xsl:text>'</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:for-each select='./*'>
<xsl:value-of select="$nl"/>
<xsl:text>,</xsl:text>
<xsl:apply-templates select='.'/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<xsl:if test='$children > 1'>
<xsl:value-of select="$nl"/>
</xsl:if>
<xsl:text>)</xsl:text>
</xsl:template>
<xsl:template match="text()|@*"> </xsl:template>
</xsl:stylesheet>
'xmlns' не является атрибутом, это объявление пространства имен.Вы по-прежнему можете получить к ним доступ в XSLT, но вам, вероятно, нужно прочитать, как обрабатываются пространства имен XML в PLSQL/Oracle, чтобы вы знали, какой результат генерировать первым, потому что он, вероятно, может отличаться от ожидаемого вывода, который вы сейчас показываете. –
@TimC кажется, что (как бы странно) это одна и та же функция для определения атрибутов или пространств имен, см., Например, http://stackoverflow.com/questions/437670/oracle-how-to-create-an-element-in-a-specific-namespace-with-xmlelement – potame
Привет, да, я знаю, какой результат я хочу получить от xslt, это в вопросе. PLSQL рассматривает xmlns как обычные атрибуты, и я тестировал утверждение в вопросе, и он работает. – Robert3452