在XSLT转换中使用XML元素的值

时间:2013-08-25 16:28:00

标签: c# xml xslt xslt-1.0

我有一个像这样的XML文件:

<Root>
  <Sensor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <position_x>2170</position_x>
    <position_y>1830</position_y>
    <module_number>10</module_number>
    <disabled>false</disabled>
    <sequence_number>0</sequence_number>
    <id_number>0</id_number>
    <channel_number>10</channel_number>
  </Sensor>
</Root>

我有一个像这样的XSL文件:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  <xsl:template match='/'>
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
      <xsl:for-each select="Root/Sensor">
        <g transform="translate(position_x,position_y)" id="S">
          <text x="118" y="20" font-family="sans-serif" font-size="18px" font-weight="bold" fill="black"><xsl:value-of select="Root/Sensor/sequence_number" /></text>
          <rect x="12" y="32" width="8" height="18" fill="#FFFFFF" stroke="black" stroke-width="1" />
          <text x="23" y="97" font-family="sans-serif" font-size="16px" fill="black"><xsl:value-of select="Root/Sensor/id_number" /></text>
          <text x="23" y="117" font-family="sans-serif" font-size="16px" fill="black"><xsl:value-of select="Root/Sensor/channel_number" /></text>
          <text x="142" y="80" font-family="sans-serif" font-size="20px" font-weight="bold" fill="black">S<xsl:value-of select="Root/Sensor/module_number" /></text>
        </g>
      </xsl:for-each>
    </svg>
  </xsl:template>
</xsl:stylesheet>

问题是我想在我的变换中使用position_x(2170)和position_y(1830)的值。但我无法弄清楚如何将它们放在那里。好像我无法放

<xsl:value-of select="Root/Sensor/position_x" />

进入变换。

有没有办法实现这个目标,还是我采取了错误的方式?

编辑:

如果我试着拥有这条线:

<g transform="translate(<xsl:value-of select="position_x"/>,<xsl:value-of select="position_y" />)" id="S">

我收到错误:'&lt;',十六进制值0x3C,在XML属性值中是非法的。

2 个答案:

答案 0 :(得分:1)

在您的for-each select="Root/Sensor"内部,上下文元素是Sensor元素,因此for-each内的任何路径都应该是相对的,例如<xsl:value-of select="position_x"/>

答案 1 :(得分:1)

首先,正如Martin Honnen正确指出的那样,您应该从所有Root/Sensor/元素中删除value-of,因为for-each中的当前节点是特定的Sensor,而不是整个文件:

<xsl:value-of select="sequence_number" />

其次,在transform属性中,您应该用大括号括起position_xposition_y,将它们标记为要评估的表达式:

<g transform="translate({position_x},{position_y})" id="S">

因此XSL文件应如下所示:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  <xsl:template match='/'>
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
      <xsl:for-each select="Root/Sensor">
        <g transform="translate({position_x},{position_y})" id="S">
          <text x="118" y="20" font-family="sans-serif" font-size="18px" font-weight="bold" fill="black"><xsl:value-of select="sequence_number" /></text>
          <rect x="12" y="32" width="8" height="18" fill="#FFFFFF" stroke="black" stroke-width="1" />
          <text x="23" y="97" font-family="sans-serif" font-size="16px" fill="black"><xsl:value-of select="id_number" /></text>
          <text x="23" y="117" font-family="sans-serif" font-size="16px" fill="black"><xsl:value-of select="channel_number" /></text>
          <text x="142" y="80" font-family="sans-serif" font-size="20px" font-weight="bold" fill="black">S<xsl:value-of select="module_number" /></text>
        </g>
      </xsl:for-each>
    </svg>
  </xsl:template>
</xsl:stylesheet>