XSLT 未转换 XML
XSLT Not Converting XML
我创建了一个 XSLT 来为 XML 文档创建一个新结构。我以前写过几个 XSLT,但我不确定这个是否有效,因为当我测试它时,XML 的结构没有改变。
如有任何帮助或建议,我们将不胜感激!
XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.demandware.com/xml/impex/catalog/2006-10-31" catalog-id="pfdc-pl-navigation-catalog">
<header>
<image-settings>
<internal-location base-path="/"/>
<view-types>
<view-type>large</view-type>
</view-types>
<alt-pattern>${productname}</alt-pattern>
<title-pattern>${productname}</title-pattern>
</image-settings>
</header>
<category category-id="Galénic">
<display-name xml:lang="x-default">Galénic</display-name>
<display-name xml:lang="pl-PL">Galénic</display-name>
<online-flag>true</online-flag>
<parent>Find_your_product</parent>
<template/>
<page-attributes/>
</category>
<category category-id="René Furterer">
<display-name xml:lang="x-default">René Furterer</display-name>
<display-name xml:lang="pl-PL">René Furterer</display-name>
<online-flag>true</online-flag>
<parent>Find_your_product</parent>
<template/>
<page-attributes/>
</category>
<category-assignment category-id="renefurterer-categories-hair" product-id="PR1357-PL"/>
<category-assignment category-id="renefurterer-categories-hair" product-id="PR1362-PL"/>
<category-assignment category-id="renefurterer-categories-hair" product-id="PR1365-PL"/>
</catalog>
这是我要应用的 XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Identity Transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:element name="categories">
</xsl:element>
</xsl:template>
<xsl:template match="category">
<category>
<xsl:element name="id">
<xsl:value-of select="@category-id" />
</xsl:element>
<xsl:element name="category_name">
<xsl:value-of select="display-name[@xml:lang='x-default']" />
</xsl:element>
<xsl:element name="parent_category">
<xsl:value-of select="parent" />
</xsl:element>
</category>
</xsl:template>
</xsl:stylesheet>
我希望达到的最终结果是:
<categories>
<category>
<id>René Furterer</id>
<category_name>René Furterer</category_name>
<parent_category>Find_your_product</parent_category>
</category>
<category>
<id>Galénic</id>
<category_name>Galénic</category_name>
<parent_category>Find_your_product</parent_category>
</category>
</categories>
如前所述,任何帮助都会很棒。
您错过了 XML 定义了默认名称空间 http://www.demandware.com/xml/impex/catalog/2006-10-31
的事实。所以唯一的模板匹配是身份模板。使用给定的模板,您可以将其完全删除。
考虑到这一点,您的样式表将如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cat="http://www.demandware.com/xml/impex/catalog/2006-10-31">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/cat:catalog">
<xsl:element name="categories">
<xsl:apply-templates select="cat:category" />
</xsl:element>
</xsl:template>
<xsl:template match="cat:category">
<xsl:element name="category">
<xsl:element name="id">
<xsl:value-of select="@category-id" />
</xsl:element>
<xsl:element name="category_name">
<xsl:value-of select="cat:display-name[@xml:lang='x-default']" />
</xsl:element>
<xsl:element name="parent_category">
<xsl:value-of select="cat:parent" />
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我只做了一些小的修改,比如用 xsl:element name="..."
替换原生元素以删除命名空间,并在 XPath 匹配中为元素名称添加前缀 prefix:element-name
以匹配适当的元素。
我创建了一个 XSLT 来为 XML 文档创建一个新结构。我以前写过几个 XSLT,但我不确定这个是否有效,因为当我测试它时,XML 的结构没有改变。
如有任何帮助或建议,我们将不胜感激!
XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="http://www.demandware.com/xml/impex/catalog/2006-10-31" catalog-id="pfdc-pl-navigation-catalog">
<header>
<image-settings>
<internal-location base-path="/"/>
<view-types>
<view-type>large</view-type>
</view-types>
<alt-pattern>${productname}</alt-pattern>
<title-pattern>${productname}</title-pattern>
</image-settings>
</header>
<category category-id="Galénic">
<display-name xml:lang="x-default">Galénic</display-name>
<display-name xml:lang="pl-PL">Galénic</display-name>
<online-flag>true</online-flag>
<parent>Find_your_product</parent>
<template/>
<page-attributes/>
</category>
<category category-id="René Furterer">
<display-name xml:lang="x-default">René Furterer</display-name>
<display-name xml:lang="pl-PL">René Furterer</display-name>
<online-flag>true</online-flag>
<parent>Find_your_product</parent>
<template/>
<page-attributes/>
</category>
<category-assignment category-id="renefurterer-categories-hair" product-id="PR1357-PL"/>
<category-assignment category-id="renefurterer-categories-hair" product-id="PR1362-PL"/>
<category-assignment category-id="renefurterer-categories-hair" product-id="PR1365-PL"/>
</catalog>
这是我要应用的 XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Identity Transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:element name="categories">
</xsl:element>
</xsl:template>
<xsl:template match="category">
<category>
<xsl:element name="id">
<xsl:value-of select="@category-id" />
</xsl:element>
<xsl:element name="category_name">
<xsl:value-of select="display-name[@xml:lang='x-default']" />
</xsl:element>
<xsl:element name="parent_category">
<xsl:value-of select="parent" />
</xsl:element>
</category>
</xsl:template>
</xsl:stylesheet>
我希望达到的最终结果是:
<categories>
<category>
<id>René Furterer</id>
<category_name>René Furterer</category_name>
<parent_category>Find_your_product</parent_category>
</category>
<category>
<id>Galénic</id>
<category_name>Galénic</category_name>
<parent_category>Find_your_product</parent_category>
</category>
</categories>
如前所述,任何帮助都会很棒。
您错过了 XML 定义了默认名称空间 http://www.demandware.com/xml/impex/catalog/2006-10-31
的事实。所以唯一的模板匹配是身份模板。使用给定的模板,您可以将其完全删除。
考虑到这一点,您的样式表将如下所示:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cat="http://www.demandware.com/xml/impex/catalog/2006-10-31">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/cat:catalog">
<xsl:element name="categories">
<xsl:apply-templates select="cat:category" />
</xsl:element>
</xsl:template>
<xsl:template match="cat:category">
<xsl:element name="category">
<xsl:element name="id">
<xsl:value-of select="@category-id" />
</xsl:element>
<xsl:element name="category_name">
<xsl:value-of select="cat:display-name[@xml:lang='x-default']" />
</xsl:element>
<xsl:element name="parent_category">
<xsl:value-of select="cat:parent" />
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我只做了一些小的修改,比如用 xsl:element name="..."
替换原生元素以删除命名空间,并在 XPath 匹配中为元素名称添加前缀 prefix:element-name
以匹配适当的元素。