Я изо всех сил пытаюсь получить xsl: element для вывода чего-либо - PullRequest
3 голосов
/ 21 декабря 2011

Я пробовал следующий xml (SimpleSampleInput.xml), который ссылается на SimpleTransform1.xsl. Я использовал Firefox и Xalan для преобразования xml, отображая его как SVG. Кажется, что оба дают одинаковые результаты. Явные части получают выходные данные, а xsl: element - нет. Кроме того, содержимое <xsl:template name="metadata" match="sample"> отображается в Firebug, но отказывается отображаться. Смущенный!

В данный момент я просто пытаюсь освоить технологию (xml + xsl -> svg), и поэтому в этом примере не выполняется весь вывод, к которому я стремлюсь, но я делаю небольшие шаги.

С удовольствием предоставим более подробную информацию, если следующей пасты недостаточно ...

Заранее спасибо:

Грег

(примечание: в моем контексте оба файла находятся в моем каталоге Apache (/ var / www / xmlxsl2svg /), и у меня есть версия Xalan 1.10.0 & Xerces версия 2.8.0)


SimpleSampleInput.xml

<?xml-stylesheet href="SimpleTransform1.xsl" type="text/xsl"?>
  <sample frame="all">
  <title>DO MYCOMMAND    </title>
  <groupseq>
    <kwd>DO MYCOMMAND    </kwd>
  </groupseq>
  <groupseq importance="optional">
    <kwd>SWITCH1    </kwd>
    <delim>(    </delim>
    <var>switch1 var    </var>
    <delim>)    </delim>
    <synnote>Switch1 description    </synnote>
  </groupseq>
  <groupchoice importance="optional">
    <kwd importance="default">SWITCH2(sw2var)    </kwd>
    <groupseq>
      <kwd>PARM    </kwd>
      <delim>(    </delim>
      <var>member-name    </var>
      <delim>)    </delim>
    </groupseq>
  </groupchoice>
</sample>

SimpleTransform1.xsl

<?xml version="1.0" encoding="UTF-8"?>
<!--xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="metadata" match="sample">
  <xsl:param name="synnote" select="groupseq"/>
  <xsl:variable name="synnoteText" >
    <xsl:element name = "text" >
      <xsl:attribute name="x">50    </xsl:attribute>
      <xsl:attribute name="y">100    </xsl:attribute>
      <xsl:attribute name="id">xslGeneratedTextElement    </xsl:attribute>
      <xsl:attribute name="style">font-family:sans-serif; font-size:12; stroke:none; fill:black; </xsl:attribute>
      xslGeneratedTextElement
      <xsl:value-of select="$synnote" />
    </xsl:element>
  </xsl:variable>

  <circle cx="90" cy="90" r="50" id="templateCircle" style="stroke:#255965; stroke-width:10px; stroke-dasharray:20,10; fill:red;"/>
  <!--the following line is the only output when this template is called! -->
  <text x="50" y="300" id="templateText" style="font-family:sans-serif; font-size:22; stroke:none; fill:green;">
    <xsl:value-of select="$synnote" />
  </text> 
  <!--the following line should output the xslGeneratedTextElement-->
  <xsl:value-of select="$synnoteText" />
</xsl:template>

<xsl:template match="sample">
  <svg width="1000" height="600" xmlns="http://www.w3.org/2000/svg">
  <xsl:call-template name="metadata" />
  <circle cx="300" cy="300" r="200" id="largeCircle" style="stroke:#255965; stroke-width:10px; stroke-dasharray:20,10; fill:pink;"/>
  <text x="50" y="20" id="titleText" style="font-family:sans-serif; font-size:12; stroke:none; fill:black;">
    <xsl:value-of select="title"/>
  </text> 
  <!--xsl:param name="bbb" match="sample"/-->
  <xsl:variable name="aaa" >
    <xsl:element name = "text2" >
      <xsl:attribute name="x">50    </xsl:attribute>
      <xsl:attribute name="y">100    </xsl:attribute>
      <xsl:attribute name="id">xslGeneratedTextElement2    </xsl:attribute>
      <xsl:attribute name="style">font-family:sans-serif; font-size:12; stroke:none; fill:black;    </xsl:attribute>
        The title is:     <xsl:value-of select="title" />
    </xsl:element>
  </xsl:variable>

  <xsl:value-of select="$aaa" />
  </svg>
</xsl:template>

</xsl:stylesheet>

Ответы [ 4 ]

2 голосов
/ 21 декабря 2011

В данный момент вы создаете элемент в переменной и используете xsl: value-of для его вывода.Однако xsl: value-of будет выводить только текстовое значение элемента, но не сам элемент.Вам понадобится xsl: copy-of

<xsl:copy-of select="$synnoteText" />

На самом деле, вы можете вообще отказаться от переменных и просто переместить код xsl: element на местогде вы хотите, чтобы элемент был создан в выходном XML.

1 голос
/ 21 декабря 2011

Заменить это :

  <xsl:variable name="aaa" > 
    <xsl:element name = "text2" > 
      <xsl:attribute name="x">50    </xsl:attribute> 
      <xsl:attribute name="y">100    </xsl:attribute> 
      <xsl:attribute name="id">xslGeneratedTextElement2    </xsl:attribute> 
      <xsl:attribute name="style">font-family:sans-serif; font-size:12; stroke:none; fill:black;    </xsl:attribute> 
        The title is:     <xsl:value-of select="title" /> 
    </xsl:element> 
  </xsl:variable> 

  <xsl:value-of select="$aaa" /> 

с гораздо более простым и правильным :

<text2 x="50" y="100" id="xslGeneratedTextElement2"
       style="font-family:sans-serif; font-size:12; stroke:none; fill:black;">
   The title is:     <xsl:value-of select="title" /> 
</text2>

Помните

  1. Целесообразно использовать xsl:element только в том случае, если имя и / или name-space-uri элемента генерируются динамически (нефиксировано, вычисляется, исходя из переменной).

  2. <xsl:value-of select="someElement"/> выводит только строковое значение из someElement, но не сам элемент. Строковое значение элемента, как определено в спецификации W3C XPath , является объединением всех его потомков текстового узла. Если вам нужно вывести полный элемент, вы можете использовать инструкцию <xsl:copy-of select="someElement"/>.

1 голос
/ 21 декабря 2011
  1. Нет необходимости встраивать элемент в переменную перед попыткой его вывода.Удалите строки, относящиеся к этому, и это должно сработать.

  2. Если вы строите элемент таким образом, чтобы сохранить XSLT DRY, я бы рекомендовал использовать именованный шаблон,которая может быть вызвана с помощью xsl:call-template.

  3. xsl:value-of выводит значение узла, в случае элемента это текст узла.Если вы хотите скопировать XML в дерево результатов, вам нужно использовать xsl:copy или xsl:copy-of

0 голосов
/ 21 декабря 2011

В дополнение к ответам, предлагающим использовать xsl:copy-of вместо xsl:value-of, вам также необходимо убедиться, что вы перемещаете xmlns="http://www.w3.org/2000/svg" непосредственно на элементы xsl:stylesheet, так как это применяется к буквальным элементам результата во всех шаблоны в любом месте вашей таблицы стилей, а не только на элемент svg и его потомков.

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