当前位置: 首页 > 知识库问答 >
问题:

合并

慎兴业
2023-03-14

我不熟悉XSLT和XPath,正在努力编写一个样式表来合并两个文件。

对于这个问题,我只想用一个简单的例子来说明我正在努力解决的概念,而不是我的实际数据。假设我有两个xml文件,其中包含独立但相关的数据。作者。xml和书籍。xml。作者。xml包含作者的集合,以及关于他们的一些基本信息,而书籍。xml包含一个书籍集合,其中包含有关书籍的信息(重要的是,包括作者)。

我希望得到一个包含作者集合的XML文件,但在每个author元素中,还包含属于该作者的书籍集合。

到目前为止,我所做的最好的事情就是复制每个作者的书籍列表,我有一种感觉,我甚至可能对这个问题采取了一种完全奇怪/错误的方法。我才刚刚开始思考样式表是如何处理的。

样品authors.xml:

<authors>
    <author>
        <name>Jane Doe</name>
        <age>25</age>
    </author>
    <author>
        <name>John Smith</name>
        <age>53</age>
    </author>
</authors>

样本书。xml:

<books>
    <book>
        <title>Flying Kites</title>
        <author>Jane Doe</author>
    </book>
    <book>
        <title>XSLT For Dummies</title>
        <author>John Smith</author>
    </book>
    <book>
        <title>Running Fast</title>
        <author>Jane Doe</author>
    </book>
</books>

样品output.xml:

<authors>
    <author>
        <name>Jane Doe</name>
        <age>25</age>
        <books>
            <book>
                <title>Flying Kites</title>
            </book>
            <book>
                <title>Running Fast</title>
            </book>
        </books>
    </author>
    <author>
        <name>John Smith</name>
        <age>53</age>
        <books>
            <book>
                <title>XSLT For Dummies</title>
            </book>
        </books>
    </author>
</authors>

我还将提供我当前的样式表,尽管我担心它可能在错误的轨道上:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="ISO-8859-1" indent="yes" method="xml"/>
<xsl:variable name="books" select="document('books.xml')"/>

<xsl:template match="/">
    <authors>
        <xsl:apply-templates select="/authors/author"/>
    </authors>
</xsl:template>

<xsl:template match="author">
    <author>
        <name><xsl:value-of select="./name"/></name>
        <age><xsl:value-of select="./age"/></age>
        <books>
            <xsl:apply-templates select="$books/books/book"/>
        </books>
    </author>
</xsl:template>

<xsl:template match="book">
    <!-- How to only copy if correct author? -->    
    <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>

我花了几个小时四处寻找,但我没有找到任何东西可以解决我的问题——尽管我的发现帮助我理解了XSLT和XPath是如何更好地工作的。

这里的问题很有帮助,但主要是关于将更新的数据“附加”到现有文件中。对我来说更相关的部分是更新日期,而提供的答案实际上并没有做到这一点——而且我自己也无法做到。

我也在/r/learnprogramming上提出了我的问题,但我得到的唯一回答基本上是“XSLT太糟糕了,现在就跑。”

我很少寻求帮助,但我在这个问题上被难住了一段时间,甚至不知道我应该采取什么方法。如有任何帮助或建议,将不胜感激。

如果相关的话,我将使用Saxon 9来处理xslt。

共有1个答案

谭池暝
2023-03-14

你就快到了。要按作者选择书籍,请使用“作者”模板中的谓词。

<xsl:template match="author">
    <author>
        <xsl:copy-of select="name"/>
        <xsl:copy-of select="age"/>
        <books>
            <xsl:apply-templates select="$books/books/book[author=current()/name]"/>
        </books>
    </author>
</xsl:template>

您也可以使用的副本(如上所示),而不是的值。

如果要复制整个节点,无需更改手册模板中的任何内容,但副本也将包括作者子节点,因此您可能需要以不同的方式执行:

<xsl:template match="book"> 
    <xsl:copy>
        <xsl:copy-of select="title"/>
    </xsl:copy>
</xsl:template>
 类似资料:
  • 当以下转换在将RDD写入文件之前执行时,它们之间有什么区别? 聚结(1,洗牌=true) 合并(1,洗牌=假) 代码示例: 它与collect()相比如何?我完全知道Spark save方法将以HDFS风格的结构存储它,但我更感兴趣的是collect()和shuffled/non shuffled coalesce()的数据分区方面。

  • 把两个分支合并到一块儿。你为了新想法,新功能,或者修复项目的 bug 创建了一些分支,最终你还是希望把这些分支合并到主分支上。Git 有几种合并算法,Fast-Forward 合并,3-Way 合并。 git merge 分支 练习 1,Fast-Forward 合并练习。介绍分支的时候我们创建了一个新分支叫 smiley-face,在这个分支上做了一次提交。这期间在主分支(master)上没发

  • 合并有时会产生冲突. 通常这些冲突很容易解决, 你也必须得去解决, 不然你的版本库就会变成多头怪 (多个最新版本). 有谁希望自己肩膀上扛着好几个脑袋? 合并 版本管理的一个重要功能是帮助多人团队进行协同代码开发. 假设 Rose 和我都想修改鳄梨酱的配方. Rose 想提高鳄梨的品质标准. 于是她把中央库最新的变更都获取了下来, 现在她的本地库是最新的: C:\Users\rose\recipe

  • sunion key1 key2...keyN 返回所有给定key的并集 sunionstore dstkey key1...keyN 同sunion,并同时保存并集到dstkey下

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 我是Apache GraphX的新手,我想看看是否可以在GraphX中进行图形合并/合并。我想做的是说我有下面的2个图