在使用xslt进行XML到XML转换时连接XML文件中不同元素的数据



那么,我有一个结构为:

的xml文件
`<root>
<messages>
<message id="1005">
<title>message1</title>
<text>text1</text1>
</message>
<message id="1012">
<title>message2</title>
<text>text2</text1>
</message>
<message id="13001">
<title>message3</title>
<text>text3</text1>
</message>  
</messages>
<data>
<sender>
<name>sender1</name>
<messages>
<message id="1005" time="12:00"/>
<message id="1012" time="12:30"/>
</messages>
</sender>
<sender>
<name>sender2</name>
<messages>
<message id="10012" time="2:00"/>
<message id="13001" time="13:20"/>
</messages>
</sender>
</data>
<root>`

每条消息需要的输出:

`<Record>
<Message>
<MessageID>1005</MessageID>
<MessageTitle>message1</MessageTitle>
<time>12:00</time>
<sender>sender1</sender>
</message>
</Record>`

我明白需要做什么才能从源文件输出id和标题。问题是我不知道如何使这种sql连接输出时间和发送者从另一个元素。

这里有一个简单的方法,可以使用一个键。

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

<xsl:output method="xml" indent="yes"/>

<xsl:key name="message_key" match="message[ancestor::data]" use="@id"/>
<xsl:template match="/">
<Records>
<xsl:apply-templates select="root/messages/message"/>
</Records>
</xsl:template>

<xsl:template match="message">
<Record>
<Message>
<MessageID><xsl:value-of select="@id"/></MessageID>
<MessageTitle><xsl:value-of select="title"/></MessageTitle>
<time><xsl:value-of select="key('message_key',@id)/@time"/></time>
<sender><xsl:value-of select="key('message_key',@id)/../../name"/></sender>
</Message>
</Record>
</xsl:template>

</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/3NqjwkK

最新更新