#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