Больше никаких тегов в выводе после преобразования xslt с использованием пространства имен

#xslt

Вопрос:

У меня есть этот исходный файл

 <?xml version="1.0" encoding="ISO-8859-1"?>
<producttypesresult xmlns="https://fr.shopping.rakuten.com/res/schema/producttypes"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="https://fr.shopping.rakuten.com/res/schema/producttypes https://fr.shopping.rakuten.com/res/schema/producttypes/producttypes.2015-06-30.xsd">
  <request>
    <user>myuser</user>
    <version>2015-06-30</version>
  </request>
  <response>
       <producttypetemplate> 
         <alias>mev_livre_livre_ancien</alias>
         <label>Livres</label>
         <categoryref>186126</categoryref>
         <updatedate>2014-08-06T00:00:00</updatedate>
       </producttypetemplate> 
  </response>
</producttypesresult>
 

Мой XSLT-это

 <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="/">
        <FMPXMLRESULT
            xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/>
            <METADATA>
                <FIELD NAME="alias" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
                <FIELD NAME="label" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
                <FIELD NAME="categoryref" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
                <FIELD NAME="updatedate" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
            </METADATA>
            <RESULTSET FOUND="">
                <xsl:for-each select="producttypesresult/response/producttypetemplate">
                    <ROW MODID="" RECORDID="">
                        <COL><DATA><xsl:value-of select="alias"/></DATA></COL>
                        <COL><DATA><xsl:value-of select="label"/></DATA></COL>
                        <COL><DATA><xsl:value-of select="categoryref"/></DATA></COL>
                        <COL><DATA><xsl:value-of select="updatedate"/></DATA></COL>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>
 

Это не работает с этим вводом из-за пространства имен, но если я изменю заголовок ввода с помощью

 <producttypesresult>
 

Это работает нормально, и я получаю желаемый результат :

 <?xml version="1.0" encoding="utf-8"?>
<FMPXMLRESULT
    xmlns="http://www.filemaker.com/fmpxmlresult">
    <ERRORCODE>0</ERRORCODE>
    <PRODUCT BUILD="" NAME="" VERSION=""/>
    <DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/>
    <METADATA>
        <FIELD NAME="alias" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
        <FIELD NAME="label" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
        <FIELD NAME="categoryref" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
        <FIELD NAME="updatedate" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
    </METADATA>
    <RESULTSET FOUND="">
        <ROW MODID="" RECORDID="">
            <COL><DATA>mev_livre_livre_ancien</DATA></COL>
            <COL><DATA>Livres</DATA></COL>
            <COL><DATA>186126</DATA></COL>
            <COL><DATA>2014-08-06T00:00:00</DATA></COL>
        </ROW>
    </RESULTSET>
</FMPXMLRESULT>

 

но очевидно, что изменение входного файла не является хорошим.
Итак, я понял, что это проблема с пространством имен, поэтому я изменил xslt на этот

                         <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="https://fr.shopping.rakuten.com/res/schema/producttypes"
xmlns="https://fr.shopping.rakuten.com/res/schema/producttypes"
> 

<xsl:output method="xml" encoding="utf-8" indent="no"/>

<xsl:template match="my">
                        

<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
<ERRORCODE>0</ERRORCODE>
<PRODUCT BUILD="" NAME="" VERSION=""/>
<DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/>

<METADATA>
<FIELD NAME="alias" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
<FIELD NAME="label" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
<FIELD NAME="categoryref" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
<FIELD NAME="updatedate" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
</METADATA>
<RESULTSET FOUND="">

<xsl:for-each select="producttypesresult/response/producttypetemplate">

<ROW MODID="" RECORDID="">
<COL><DATA><xsl:value-of select="alias"/></DATA></COL>
<COL><DATA><xsl:value-of select="label"/></DATA></COL>
<COL><DATA><xsl:value-of select="categoryref"/></DATA></COL>
<COL><DATA><xsl:value-of select="updatedate"/></DATA></COL>
</ROW>

</xsl:for-each>
</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
</xsl:stylesheet>
                        
 

Я получаю желаемое значение fileds, но все теги пусты, поэтому я просто получаю

 <?xml version="1.0" encoding="utf-8"?>

  
    myuser
    2015-06-30
  
  
        
         mev_livre_livre_ancien
         Livres
         186126
         2014-08-06T00:00:00
 

Итак, как получить желаемый результат со всеми моими тегами ?
Спасибо

Ответ №1:

Вы правильно начали с объявления пространства имен и привязки его к префиксу, но используете его не по назначению.

Попробуй :

 <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="https://fr.shopping.rakuten.com/res/schema/producttypes"
exclude-result-prefixes="my">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="/">
        <FMPXMLRESULT
            xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/>
            <METADATA>
                <FIELD NAME="alias" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
                <FIELD NAME="label" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
                <FIELD NAME="categoryref" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
                <FIELD NAME="updatedate" TYPE="TEXT" EMPTYOK="YES" MAXREPEAT=""/>
            </METADATA>
            <RESULTSET FOUND="">
                <xsl:for-each select="my:producttypesresult/my:response/my:producttypetemplate">
                    <ROW MODID="" RECORDID="">
                        <COL><DATA><xsl:value-of select="my:alias"/></DATA></COL>
                        <COL><DATA><xsl:value-of select="my:label"/></DATA></COL>
                        <COL><DATA><xsl:value-of select="my:categoryref"/></DATA></COL>
                        <COL><DATA><xsl:value-of select="my:updatedate"/></DATA></COL>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>    
</xsl:stylesheet>
 

Комментарии:

1. о боже, ты мой герой, ты сделал мой день, миллион благодарностей !

2. Кстати, если вы используете последнюю версию Filemaker, есть довольно много элементов и атрибутов, которые вы можете удалить из своей таблицы стилей, поскольку они не используются во время импорта — см. Таблицу по адресу help.claris.com/en/pro-help/content/xml-format.html