【问题标题】:XSLT - Create a node from another contextXSLT - 从另一个上下文创建节点
【发布时间】:2016-05-24 09:00:58
【问题描述】:

我有以下 XML 文件:

<config>
    <files>
        <file uuid="uuid-file1">
            <name>File1</name>
        </file>
        <file uuid="uuid-file2">
            <name>File2</name>
        </file>
        <file uuid="uuid-file3">
            <name>File3</name>
        </file>
        <file uuid="uuid-file4">
            <name>File3</name>
        </file>
    </files>
    <folders>
        <folder uuid="root" />
        <folder uuid="folder1">
            <member ref="uuid-file1" />
        </folder>
        <folder uuid="folder2">
            <member ref="uuid-file2" />
        </folder>
    </folders>
</config>

ie = file1 被引用到文件夹 1,file2 被引用到文件夹 2。 file3 和 file4 不在一个文件夹中。

我的问题:

我会创建一个 XSLT 转换来浏览所有“文件”并在文件夹“根”中为它们创建一个引用,这些引用在文件夹中没有被引用。

示例(file3 和 file4 不在文件夹中):

<config>
    <files>
        <file uuid="uuid-file1">
            <name>File1</name>
        </file>
        <file uuid="uuid-file2">
            <name>File2</name>
        </file>
        <file uuid="uuid-file3">
            <name>File3</name>
        </file>
        <file uuid="uuid-file4">
            <name>File4</name>
        </file>
    </files>
    <folders>
        <folder uuid="root" >
            <member ref="uuid-file3" />
            <member ref="uuid-file4" />
        </folder>
        <folder uuid="folder1">
            <member ref="uuid-file1" />
        </folder>
        <folder uuid="folder2">
            <member ref="uuid-file2" />
        </folder>
    </folders>
</config>

我尝试使用“for-each”循环来执行此操作,但当我浏览“文件”节点时,我不知道如何在文件夹“根”中创建一个新节点...

我需要你的帮助:-)

问候, 齐多

【问题讨论】:

  • 您能展示一下您尝试的 XSLT 吗?和它的问题?将更有可能获得帮助...

标签: xml xslt


【解决方案1】:

试试这个方法:

XSLT 1.0

<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="*"/>

<xsl:key name="folder" match="folder" use="member/@ref" />

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

<xsl:template match="folder[@uuid='root']">
    <xsl:copy>
        <xsl:for-each select="/config/files/file[not(key('folder', @uuid))]">
            <member ref="{@uuid}"/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意,这假设我们知道如何识别“根”文件夹(在此示例中,其@uuid 值实际上是字符串“根”)。您问题的这一部分还不是很清楚。

【讨论】:

  • 右:文件夹“root”由其uuid标识,等于“root”。
  • 非常感谢!它完美地工作。我刚刚添加了 来复制整个树。
  • @zido71 identity transform 模板“复制整个树”。
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多