我使用 xslt 2.0 将 xml 数据转换为 xml 文件。我创建了 xsl 来查找文件夹中的所有文件名,效果很好:

文件名.xml

<?xml version="1.0" encoding="UTF-8"?>
<filelist>
   <file>birds2014.xml</file>
   <file>birds2013.xml</file>
</filelist>

然后我创建了一个 xsl 来在 xml 文件中搜索以选择标签中的所有鸟类名称 <spbird> 在所有文件中。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:template match="*">
        <xsl:apply-templates/> 
        <xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>
            <xsl:element name="birdname">
                <xsl:for-each select="document($files)">    
                    <xsl:value-of select="//spbird">
                    </xsl:value-of>
                </xsl:for-each>
            </xsl:element>  
    </xsl:template>

结果:

<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>

预期的:

<birdname>Papagei</birdname>
<birdname>Wellensittich</birdname>
<birdname>Pfau</birdname>

有人可以帮忙吗?

编辑我改变了

 <xsl:template match="*">

   <xsl:template match="/">

这解决了相同结果出现 9 次的问题(这个数字来自哪里)。

现在在您的帮助下,结果是:

<birdname>Papagei Wellensittich</birdname>
<birdname>Pfau</birdname>

Pfau 是第二个 xml 文件中的鸟。唯一的问题是, document() 似乎自己执行了 for-each 操作。所以我没有在鸟名标签中单独列出所有鸟类。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:template match="*">
        <xsl:apply-templates/> 
        <xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>

                <xsl:for-each select="document($files)">   
                       <birdname> 
                         <xsl:value-of select="//spbird">
                       </birdname>
                    </xsl:value-of>
                </xsl:for-each>
            </xsl:element>  
    </xsl:template>
有帮助吗?

解决方案

尝试将您的元素放入 xsl:for-each...

<xsl:for-each select="document($files)">    
    <birdname>
        <xsl:value-of select="//spbird"/>            
    </birdname>
</xsl:for-each>

笔记:除非您尝试动态构建元素名称,否则没有理由使用 xsl:element.

编辑

在 XSLT 2.0 中, xsl:value-of 会给你每一个价值 spbird. 。代替 xsl:for-each 在文档上,您应该对 spbird. 。尝试改变你的 xsl:for-each 下面的例子。如果这不起作用,请在您的问题中添加鸟类文件的示例。

<xsl:for-each select="document($files)//spbird">    
    <birdname>
        <xsl:value-of select="."/>            
    </birdname>
</xsl:for-each>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top