0

输入 :

    <?xml version="1.0" encoding="utf-8" ?> 
    <products>
            <product ID="123">
                    <Product Name>Sample Name 1</Product Name>
                    <Images>
                            <Image>url1</Image> 
                            <Image>url2</Image> 
                            <Image>url3</Image> 
                    </Images>
            </product>
            <product ID="456">
                    <Product Name>Sample Name 2</ProductName>
                    <Images>
                            <Image>url4</Image> 
                            <Image>url5</Image> 
                            <Image>url6</Image> 
                    </Images>
            </product>
    </products>

输出 :

    <?xml version="1.0" encoding="utf-8" ?> 
    <products>
            <product ID="123">
                    <ProductName>Sample Name 1</ProductName>
                    <Image>url1</Image> 
            </product>
            <product ID="456">
                    <ProductName>Sample Name 2</ProductName>
                    <Image>url4</Image> 
            </product>
    </products>

正如您在上面看到的,有两个变化:

元素标签“产品名称”更改为“产品名称”。

每个产品有多个“图像”元素嵌套在“图像”元素下,其中只有第一个被保留,其他被丢弃并在层次结构中提出。

一个 xslt 可以做到这一点吗?

当在同一个文件上多次执行此 xslt 转换时,是否可能不会出现错误?最后一个请求,我找不到适合此请求的标题/标签。请建议一些其他人更容易找到的东西。我会更新它(如果允许)。

4

2 回答 2

0

对的,这是可能的。实际上遵循非常简单的模板可以完成这项工作。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="xml" indent="yes" />

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

    <xsl:template match="Images">
        <xsl:copy-of select="Image[1]" />
    </xsl:template>
</xsl:stylesheet>
于 2013-07-15T14:25:36.387 回答
0

这将不起作用,因为您的 XML 格式不正确。元素名称中不允许有空格。如果 XML 格式正确,则很容易满足您的请求 2。

假设您以某种方式获得格式良好的 XML。比有一个身份转换的厕所, 例如

而不是为仅考虑第一个图像的图像添加模板:

<xsl:template match="Images">
    <xsl:copy>
        <xsl:apply-templates select=" @* | Image[1]"/>
    </xsl:copy>
</xsl:template>
于 2013-07-15T13:30:45.713 回答