如何正确使用following-sibling



我有一个看起来像这样的XML:

<desc year="1879">
<date from="1879-08-30" to="1879-08-30"/> 
<placeName>New York</placeName> 
<placeName>New Jersey</placeName>
<note>visiting my grandma</note>
<date from="1879-10-30" to="1879-11-01"/> 
<placeName>Berlin</placeName> 
<note>with my mother</note>
<placeName>Hamburg</placeName>
</desc>

我想为每个placeName转移desc Elements到event Elements。这是可行的,但要么每个注释都被转移到每个事件,而不仅仅是它之前的placeName中的一个,要么根本没有注释元素。

这是我当前的代码:

<xsl:template match="//tei:desc">
<xsl:variable name="note-content">
<xsl:for-each select="//tei:placeName">
<xsl:if test="following-sibling::tei:note[1]">
<xsl:element name="note" namespace="http://www.tei-c.org/ns/1.0">
<xsl:value-of select="following-sibling::tei:note[1]"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:for-each-group select="*" group-starting-with="tei:date">
<!-- other specifications -->
<xsl:for-each select="current-group()[name()='placeName']">
<xsl:element name="event" namespace="http://www.tei-c.org/ns/1.0">
<!-- other specifications -->
<xsl:element name="desc" namespace="http://www.tei-c.org/ns/1.0">
<xsl:element name="placeName" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="ref"/>
<xsl:value-of select="."/>
</xsl:element>
</xsl:element>
<xsl:if test="$note-content !=''">
<xsl:element name="note" namespace="http://www.tei-c.org/ns/1.0">
<xsl:value-of select="$note-content"/>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>

我不能100%确定我确切地知道你想要什么输出(通常是一个好主意,显示你想要的输出,而不是依赖于你想要做的事情的描述),但它看起来像你想要分组desc子元素从每个date开始,并在该组内你想为每个placeName创建一个不同的event,然后包含placeNamenote?也可能是date?

无论如何,我希望这个建议能让你更接近你想要的:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:tei="http://www.tei-c.org/ns/1.0"
xpath-default-namespace="http://www.tei-c.org/ns/1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<!-- this template is just to provide a root element for the example outut -->
<xsl:template match="/">
<xsl:element name="listEvent" namespace="http://www.tei-c.org/ns/1.0">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="desc">
<xsl:for-each-group select="*" group-starting-with="date">
<xsl:for-each select="current-group()[self::placeName]">
<xsl:element name="event" namespace="http://www.tei-c.org/ns/1.0">
<xsl:element name="desc" namespace="http://www.tei-c.org/ns/1.0">
<!-- copy everything except notes and placeNames -->
<xsl:copy-of select="current-group()[not(self::note | self::placeName)]"/>
<!-- copy the current placeName -->
<xsl:copy-of select="."/>
</xsl:element>
<!-- finally copy the note(s) -->
<xsl:copy-of select="current-group()[self::note]"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>

结果:

<listEvent xmlns="http://www.tei-c.org/ns/1.0">
<event>
<desc>
<date from="1879-08-30" to="1879-08-30"/>
<placeName>New York</placeName>
</desc>
<note>visiting my grandma</note>
</event>
<event>
<desc>
<date from="1879-08-30" to="1879-08-30"/>
<placeName>New Jersey</placeName>
</desc>
<note>visiting my grandma</note>
</event>
<event>
<desc>
<date from="1879-10-30" to="1879-11-01"/>
<placeName>Berlin</placeName>
</desc>
<note>with my mother</note>
</event>
<event>
<desc>
<date from="1879-10-30" to="1879-11-01"/>
<placeName>Hamburg</placeName>
</desc>
<note>with my mother</note>
</event>
</listEvent>

相关内容

最新更新