我正在努力让xsl:element输出任何东西

时间:2011-12-21 10:22:02

标签: xml xslt svg

我尝试了以下xml(SimpleSampleInput.xml),它引用了SimpleTransform1.xsl。我使用Firefox和Xalan来转换xml,将其渲染为SVG。似乎两者都给出了相同的结果。显式部分得到输出,但xsl:element部分没有。此外,<xsl:template name="metadata" match="sample">的内容显示在Firebug中但拒绝呈现。困惑!

目前我只是想要掌握这项技术(xml + xsl - &gt; svg),所以这个例子没有尝试我所瞄准的所有输出但是我采取了一些小步骤

如果以下粘贴不够,请尽快提供更多详细信息......

提前致谢:

格雷格

(在我的上下文中,这两个文件都在我的Apache目录中(/ var / www / xmlxsl2svg /),我有Xalan版本1.10.0&amp; 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 个答案:

答案 0 :(得分:2)

目前,您正在变量中创建元素,并使用 xsl:value-of 输出它。但是, xsl:value-of 只会输出元素的文本值,而不会输出元素本身。您需要 xsl:copy-of

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

实际上,您可以完全取消变量,只需将 xsl:element 代码移动到您希望在输出XML中创建元素的位置。

答案 1 :(得分:1)

  1. 在尝试输出变量之前,无需在变量中构建元素。删除与之相关的行,它应该可以工作。

  2. 如果要以这种方式构建元素以保持XSLT DRY,我建议使用命名模板,可以使用xsl:call-template调用。

  3. xsl:value-of输出节点的值,对于元素,这是节点的文本。如果您希望将xml复制到结果树中,则需要使用xsl:copyxsl:copy-of

答案 2 :(得分:1)

替换

  <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. 仅当元素的名称和/或名称空间uri是动态生成(非固定,计算,来自变量)时才使用xsl:element是有意义的。

    < / LI>
  2. <xsl:value-of select="someElement"/>仅输出someElement字符串值,而不是元素本身。 W3C XPath specification 中定义的元素的字符串值是其所有文本节点后代的串联。如果需要输出complete元素,可以使用<xsl:copy-of select="someElement"/>指令。

答案 3 :(得分:0)

除了建议您使用xsl:copy-of代替xsl:value-of的答案外,您还需要确保直接在xmlns="http://www.w3.org/2000/svg"元素上移动xsl:stylesheet它适用于样式表中任何位置的所有模板中的文字结果元素,而不是当前仅适用于svg元素及其后代。