URI пространства имен XLST включен в XML имя элемента - PullRequest
0 голосов
/ 20 января 2020

так что мое пространство имен объявлено в таблице стилей, как это

<xmlns:address="http://base.google.com/ns/1.0"

ниже - мой полный шаблон XSLT-преобразования

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:address="http://base.google.com/ns/1.0" exclude-result-prefixes="address">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="success"/>
<xsl:template match="paging"/>
<xsl:template match="orders">
    <xsl:element name="Items" >
        <xsl:for-each select="order">
            <xsl:element name="item">
                <xsl:element name="entity_id">
                    <xsl:value-of select="order_no"/>
                </xsl:element>
                <xsl:element name="grand_total">
                    <xsl:value-of select="total"/>
                </xsl:element>
                <xsl:element name="shipping_amount">
                    <xsl:value-of select="shipping"/>
                </xsl:element>
                <xsl:element name="state">
                    <xsl:value-of select="status"/>
                </xsl:element>
                <xsl:element name="created_at">
                    <xsl:value-of select="created"/>
                </xsl:element>
                <xsl:for-each select="client">
                    <address:customer_id>
                        <xsl:value-of select="client_id"/>
                    </address:customer_id>
                    <xsl:element name="address:firstname">
                        <xsl:value-of select="first_name"/>
                    </xsl:element>
                    <xsl:element name="address:lastname">
                        <xsl:value-of select="last_name"/>
                    </xsl:element>  
                    <xsl:element name="address:company">
                        <xsl:value-of select="company"/>
                    </xsl:element>  
                    <xsl:element name="address:street">
                        <xsl:value-of select="street"/>
                    </xsl:element> 
                    <xsl:element name="address:city">
                        <xsl:value-of select="city"/>
                    </xsl:element>  
                    <xsl:element name="address:telephone">
                        <xsl:value-of select="phone"/>
                    </xsl:element>  
                    <xsl:element name="address:email">
                        <xsl:value-of select="email"/>
                    </xsl:element>  
                    <xsl:element name="address:region">
                        <xsl:value-of select="country"/>
                    </xsl:element>
                </xsl:for-each>
                <xsl:for-each select="items">
                    <xsl:for-each select="item">
                        <xsl:element name="product_name">
                            <xsl:value-of select="name"/>
                        </xsl:element>
                        <xsl:element name="product_id">
                            <xsl:value-of select="product_id"/>
                        </xsl:element>
                        <xsl:element name="price">
                            <xsl:value-of select="price"/>
                        </xsl:element>
                        <xsl:element name="item_id">
                            <xsl:value-of select="item_id"/>
                        </xsl:element>
                        <xsl:element name="tax">
                            <xsl:value-of select="tax"/>
                        </xsl:element>
                        <xsl:element name="qty">
                            <xsl:value-of select="qty"/>
                        </xsl:element>                            
                    </xsl:for-each>                        
                </xsl:for-each>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
</xsl:template>

что я намерен сделать создать узлы пространства имен, подобные этому <address:lastname>, но в результате я получаю <address:firstname xmlns:address="http://base.google.com/ns/1.0"> Я довольно новичок в XSLT, поэтому не совсем уверен, в чем проблема, увидев пару постов, в которых упоминается опция исключения префиксов пространства имен, которая тоже не работает

1 Ответ

1 голос
/ 20 января 2020

Во-первых, полученный вами отчет верен: правильно сформированный документ XML не может использовать префикс без привязки его к пространству имен. Если ваше целевое приложение не может обработать это, то это не соответствует спецификации XML.

Однако вы можете попробовать переместить объявление пространства имен в ваш элемент root вместо того, чтобы повторять его на каждом address::* элемент. Вместо:

<xsl:element name="Items" >

используйте:

<Items xmlns:address="http://base.google.com/ns/1.0">

и удалите то же объявление пространства имен из начального тега xsl:stylesheet. Это должно привести к документу, структурированному как:

<Items xmlns:address="http://base.google.com/ns/1.0">
  <item>
    <entity_id/>
    <grand_total/>
    <shipping_amount/>
    <state/>
    <created_at/>
    <address:customer_id/>
    <address:firstname/>
    <address:lastname/>
    <address:company/>
    <address:street/>
    <address:city/>
    <address:telephone/>
    <address:email/>
    <address:region/>
  </item>
</Items>

, который, надеюсь, ваше целевое приложение может обработать лучше, чем ваш (семантически идентичный) текущий результат.


Как отмечалось в комментариях, вы можете упростить свою таблицу стилей, заменив все остальные инструкции xsl:element на буквальные элементы результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...