Я новичок в XSL.Просто говорю это заранее.:)
Я пытаюсь преобразовать XML, который выглядит следующим образом:
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
<root>
<node>
<name>A</name>
<out>D, B, C, </out>
</node>
<node>
<name>B</name>
<out>A, E, C, </out>
</node>
</root>
в файл .dot, который выглядит следующим образом:
Digraph G
{
A -> D
A -> B
A -> C
B -> A
B -> E
B -> C
}
, используя XSL,То, что я имею до сих пор о XSL,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
Digraph G
{
<xsl:apply-templates select="root/node/out"/>
}
</xsl:template>
<xsl:template match="root/node/out">
<xsl:call-template name="tokenize">
<xsl:with-param name="csv" select="." />
</xsl:call-template>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="csv" />
<xsl:variable name="iter" select="normalize-space(
substring-before( concat( $csv, ','), ','))" />
<xsl:if test="$iter">
<!-- X is a placeholder -->
X -> <xsl:value-of select="$iter" />
<xsl:call-template name="tokenize">
<xsl:with-param name="csv" select="substring-after($csv,',')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
приводит к таким выводам здесь:
Digraph G
{
X -> D
X -> B
X -> C
X -> A
X -> E
X -> C
}
Я не собираюсь лгать: я нашел биты кода XSL, немного изучил, и исказил что-то вроде эффективного на место.По крайней мере, у меня нормально работают терминальные узлы;Теперь моя проблема заключается в получении начальных узлов.
Я думаю, что мне нужно как-то сделать вложенный цикл for-each, передавая свойство в качестве параметра.
Идея псевдокода:
For each <node/name>
Parameter n = <name>
For-each <node/out> of n
<name> -> <out>
Я все еще пытаюсь понять логику XSL, и поэтому я пытаюсь понять, как токенизация может быть интегрирована в эту проблему.Это просто еще не очевидно для меня.Я постоянно пытаюсь найти решение, но оно пока не нажимает на них.
Любая помощь очень ценится.Спасибо за любое время, -Jon