XSL: Используете tokenize для генерации списка соединений с графами .dot? - PullRequest
0 голосов
/ 28 сентября 2018

Я новичок в 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

1 Ответ

0 голосов
/ 28 сентября 2018

Измените

<xsl:template match="root/node/out">
 <xsl:call-template name="tokenize"> 
   <xsl:with-param name="csv" select="." /> 
 </xsl:call-template>    
</xsl:template>

на

<xsl:template match="root/node/out">
 <xsl:call-template name="tokenize"> 
   <xsl:with-param name="csv" select="." /> 
   <xsl:with-param name="name" select="../name"/>
 </xsl:call-template>    
</xsl:template>

, затем убедитесь, что вы объявляете этот параметр в названном шаблоне и используете его, например, с <xsl:value-of select="$name"/>, где вы хотите, чтобы он выводился, и, конечно,также убедитесь, что вы передаете его в рекурсивном call-template с <xsl:with-param name="name" select="$name"/>.

Как новичок в XSLT, я бы посоветовал заглянуть в текущую версию XSLT 3 или в 11-летний XSLT 2 (где tokenize доступен как функция XPath) вместо ссор с 20-летним XSLT 1 и рекурсивными вызываемыми шаблонами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...