[править] сообщение обновлено с исправленным XML и желаемым выводом, как описано в ответе и комментариях Винсента Биранне.
Я пытаюсь собрать некоторый код для преобразования данных XML втекстовый метафайл.Мне не повезло заставить его выплеснуть желаемый результат, и в настоящее время я немного застрял, поэтому любая помощь будет принята.
XSLT 1.0 не облегчает токенизацию, и вот где я застрял: я бы хотелобрабатывать @syn как строку CSV и разбивать ее при необходимости.
Я работаю со следующими данными XML (обратите внимание, что все узлы, кроме узла , в этом файле XML могут иметьлюбое имя.)
<Meta>
<Subject>
<People>
<Jane_Doe syn="janie, jd" />
<John_Doe/>
</People>
<Object>
<Table>
<Leg/>
</Table>
<Chair syn="seat" />
</Object>
</Subject>
<Test1>
<Test2 syn="testy"/>
<Test3>
<Test4/>
</Test3>
</Test1>
</Meta>
Этот XML необходимо преобразовать, чтобы вывод выглядел следующим образом:
[Subject]
[People]
Jane_Doe
{janie}
{jd}
John_Doe
[Object]
[Table]
Leg
Chair
{seat}
[Test1]
Test2
{testy}
[Test3]
Test4
Мой текущий XSL:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/Meta"><xsl:apply-templates/></xsl:template>
<xsl:template match="child::*"><xsl:call-template name="master"/><xsl:apply-templates/></xsl:template>
<xsl:template name="master">
<xsl:choose>
<xsl:when test="count(child::*) = 0">
<xsl:value-of select="local-name()"/>
<xsl:apply-templates select="@syn"/>
</xsl:when>
<xsl:otherwise>
[<xsl:value-of select="local-name()"/>]
<xsl:apply-templates select="@syn"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="tokenize" match="@syn">
<xsl:param name="text" select="."/>
<xsl:param name="separator" select="','"/>
<xsl:value-of select="$text"/>
<xsl:choose>
<xsl:when test="not(contains($text, $separator))">
{<xsl:value-of select="normalize-space($text)"/>}
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="normalize-space(substring-before($text, $separator))"/>
<xsl:call-template name="tokenize">
{<xsl:with-param name="text" select="substring-after($text, $separator)"/>}
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>