【问题标题】:Select from within a fileliste of xml从 xml 的文件列表中选择
【发布时间】:2014-04-11 15:46:13
【问题描述】:

我使用 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 文件中进行搜索,以选择所有文档中位于标签 &lt;spbird&gt; 中的所有鸟的名称。

    <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>

【问题讨论】:

    标签: xml xslt filelist


    【解决方案1】:

    尝试将您的元素放入 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 上执行for-each。尝试将您的 xsl:for-each 更改为以下示例。如果这不起作用,请在您的问题中添加鸟类文件的示例。

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

    【讨论】:

    • 谢谢,改了,看看我的编辑...仍然不是我预期的结果。
    • @user3500768 - 查看我的更新。如果这不起作用,请使用鸟 xml 的示例(包含 spbird)更新您的问题。
    • 是的,这是合乎逻辑的,非常感谢。像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多