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 以匹配适当的元素。