Как конвертировать XML через XSLT и игнорировать 2 XMLNS - PullRequest
0 голосов
/ 24 сентября 2018
<Products xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9" 
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">

<Product>
<status>1</status> 
<ProductName>******************</ProductName> 
<model>******************</model>
<ProductQTY>******************</ProductQTY> 
<CostPrice>******************</CostPrice>
<RetailPrice>******************</RetailPrice> 
<FullCategoryPath>******************</FullCategoryPath>
<description> 
<![CDATA[******************
]]></description> 
<image_link>https://******************</image_link> 
</Product>
<Product>
<status>1</status>
<ProductName>******************</ProductName>
<model>******************7</model>
<ProductQTY>0</ProductQTY> 
<CostPrice>1******************</CostPrice>
<RetailPrice>141.9</RetailPrice> 
<FullCategoryPath>******************</FullCategoryPath><description> 
<![CDATA******************
  ]]></description> 
<image_link>https://******************</image_link>
</Product>
</Products>    <!-- Added by edit -->

как вы видите выше.
Как я могу исправить свой XSLT-файл?

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
            xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9" 
            xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"               
            exclude-result-prefixes="sitemap image">

    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node() "/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xml>
            <xsl:for-each select="node()">
                <xsl:choose >
                    <xsl:when test="node() | model !=''">
                        <Product>     
                            <xsl:apply-templates select="@* | node() "/>
                            <SProductCode >
                                <xsl:value-of select="node() | @model" />
                            </SProductCode>
                            <CategoryName>
                                <value-of select=""/>
                            </CategoryName>
                            .
                            .
                            .
                            .
                        </Product>
                    </xsl:when>
                </xsl:choose>
            </xsl:for-each>
        </xml>
    </xsl:template>
</xsl:stylesheet>    <!-- Added by edit -->

Например:
Как я могу показать названия категорий, например, название продукта.из моего узла ().Я не могу их разобрать.

xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns: image =" http://www.google.com/schemas/sitemap-image/1.1"

Эти два пространства имен так сильно портят меня. Они внутри моего корняэлемент «Продукты».

Вывод: все значения ложные.

<xml>
     <Product>
       <SProductCode>1</SProductCode>
       <CategoryName>
         <value-of select="node() | @model" />
       </CategoryName>
     </Product>
     <Product>
       <SProductCode>1</SProductCode>
       <CategoryName>
         <value-of select="node() | @model" />
       </CategoryName>
     </Product>

Что я напишу для "SProductCode" или "CategoryName", чтобы правильно запустить его?

1 Ответ

0 голосов
/ 24 сентября 2018

Следующий модифицированный шаблон подходит к желаемому результату.Я удалил некоторый ненужный код, но не смог определить, какие значения вы хотите поместить в xsl:value-of select="..." />.Я также изменил ваш xsl:choose на простой предикат цикла Product xsl:for-each.

<xsl:template match="/Products">
    <xml>
        <xsl:for-each select="Product[model != '']">
            <Product>     
                <SProductCode >
                    <xsl:value-of select="model" />
                </SProductCode>
                <CategoryName>
                    <xsl:value-of select="FullCategoryPath"/>
                </CategoryName>
                .
                .
                .
                .
            </Product>
        </xsl:for-each>
    </xml>
</xsl:template>

Вывод:

<xml>
    <Product>
        <SProductCode>******************</SProductCode>
        <CategoryName>******************</CategoryName>
        .
        .
        .
        .
    </Product>
    <Product>
        <SProductCode>******************7</SProductCode>
        <CategoryName>******************</CategoryName>
        .
        .
        .
        .
    </Product>
</xml>
...