XSL-преобразование возвращает пустое значение - PullRequest
0 голосов
/ 12 октября 2018

У меня проблема с получением моих входных данных при выполнении преобразования xsl.

Это мой исходный ввод XML (входной XML)

<?xml version="1.0" encoding="UTF-8"?> <ns2:pointOfSale 
xmlns:ns2="http://example.net/.." 
mode="CREATE" timestamp="2018-10-12T09:34:53.14+02:00"><ns2:id 
type="AMP">15573</ns2:id></ns2:pointOfSale>

Это мой результат вывода (вывод xml)

<?xml version="1.0" encoding="utf-8"?><clients xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="setClients.xsd" encryptedData="N"><client clientID=""></client></clients>

это мой xsl

<?xml version="1.1" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns2="http://example.net/.."
exclude-result-prefixes="xs xd"
version="2.0">

<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
    <xsl:element name="clients">
        <xsl:attribute 
        name="xsi:noNamespaceSchemaLocation">setClients.xsd</xsl:attribute>
        <xsl:attribute name="encryptedData">N</xsl:attribute>
                <xsl:element name="client">
                    <xsl:attribute name="clientID" >
                    <xsl:value-of select="ns2:id"/>
                    </xsl:attribute>
                </xsl:element>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

Как видите, значение идентификатора элемента пустое ("")

В чем проблема?это совпадение ()?Может быть, проблема пространства имен?

спасибо.

1 Ответ

0 голосов
/ 12 октября 2018

Есть две причины, по которым <xsl:value-of select="id"/> ничего не возвращает.

Во-первых, ваш шаблон соответствует "/", который является узлом документа.Это родительский узел ns2:pointOfSale в вашем XML.Узел документа не имеет id как дочерний элемент, поэтому <xsl:value-of select="id"/> не найдет ничего.Чтобы исправить это, вы должны сопоставить корневой элемент (в данном случае ns2:pointOfSale) вместо

<xsl:template match="/*">

Вторая проблема связана с пространствами имен.Предполагая, что в вашем XML есть объявление пространства имен в форме xmlns:ns2="xxx.xxxx", вы бы добавили такое же объявление в свой XSLT (для элемента xsl:stylesheet), а затем могли бы это сделать.

<xsl:value-of select="ns2:id"/>

Без какой-либо ссылкик пространству имен в вашем XSLT, он будет искать элемент id без пространства имен.

Попробуйте этот XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="xs xd"
xmlns:ns2="xxx.xxxx"
version="2.0">

<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="/*">
    <xsl:element name="clients">
        <xsl:attribute 
        name="xsi:noNamespaceSchemaLocation">setClients.xsd</xsl:attribute>
        <xsl:attribute name="encryptedData">N</xsl:attribute>
                <xsl:element name="client">
                    <xsl:attribute name="clientID" >
                    <xsl:value-of select="ns2:id"/>
                    </xsl:attribute>
                </xsl:element>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

На самом деле, поскольку вы используете XSLT 2.0, вы могли бывместо этого используйте xpath-default-namespace, что будет означать, что XSLT будет рассматривать любой нефиксированный элемент в выражении select как часть этого пространства имен.

Попробуйте это тоже ....

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="xs xd"
xpath-default-namespace="xxx.xxxx"
version="2.0">

<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="/*">
    <xsl:element name="clients">
        <xsl:attribute 
        name="xsi:noNamespaceSchemaLocation">setClients.xsd</xsl:attribute>
        <xsl:attribute name="encryptedData">N</xsl:attribute>
                <xsl:element name="client">
                    <xsl:attribute name="clientID" >
                    <xsl:value-of select="id"/>
                    </xsl:attribute>
                </xsl:element>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

ЛучшеТем не менее, используйте шаблоны значений атрибутов (и избегайте использования xsl:element), чтобы упростить XSLT до этого ...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="xs xd"
xpath-default-namespace="xxx.xxxx"
version="2.0">

<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="no" indent="no" />
<xsl:strip-space elements="*" />
<xsl:template match="/*">
    <clients xsi:noNamespaceSchemaLocation="setClients.xsd" encryptedData="N">
        <client clientID="{id}" />
    </clients>
</xsl:template>
</xsl:stylesheet>
...