XSLT Выбрать узел на текущем уровне другой атрибут
Я пытаюсь найти самый элегантный способ создания диапазона дат на основе дат начала и окончания. У меня есть следующий XML:
<mods:originInfo>
<mods:dateCreated point="start">2006</mods:dateCreated>
<mods:dateCreated point="end">2007</mods:dateCreated>
<mods:dateCaptured point="start">2009</mods:dateCaptured>
<mods:dateCaptured point="end">2010</mods:dateCaptured>
</mods:originInfo>
У меня есть XSLT, который включает
<xsl:template match="mods:originInfo">
<xsl:for-each select="child::*[@point='start']">
<dc:date>
<xsl:value-of select="."/>-<xsl:value-of select="../*[local-name()][@point='end']"/>
</dc:date>
</xsl:for-each>
</xsl:template>
Когда я запускаю это, я получаю следующий вывод:
<dc:date>2006-2007</dc:date>
<dc:date>2009-2007</dc:date>
Я пытаюсь найти способ, чтобы этот код выбирал правильное значение "конечного" узла. Любая помощь приветствуется.
1 ответ
Решение
Одна единственная модификация: заменить ../
с following-sibling::
и это должно работать:
<xsl:template match="mods:originInfo">
<xsl:for-each select="child::*[@point='start']">
<dc:date>
<xsl:value-of select="."/>-<xsl:value-of select="following-sibling::*[local-name()][@point='end'][1]"/>
</dc:date>
</xsl:for-each>
</xsl:template>
Выход:
<dc:date xmlns:dc="dc">2006-2007</dc:date>
<dc:date xmlns:dc="dc">2009-2010</dc:date>