2013-08-25 4 views
1

У меня есть файл XML, как это:Используя значение элемента XML в XSLT преобразование

<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" /> 

в трансформацию.

Есть ли способ достичь этого, или я об этом ошибаюсь?

EDIT:

Если я пытаюсь иметь строку:

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

я получаю ошибку: '<', шестнадцатеричное значение 0x3c, является незаконным в XML значения атрибутов.

ответ

1

Сначала, как Мартин Honnen правильно указывает, вы должны удалить Root/Sensor/ из всех value-of элементов, так как текущий узел внутри for-each является частным Sensor, а не весь документ:

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

Во-вторых, в transform атрибут, вы должны окружить position_x и position_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> 
1

Внутри вашего for-each select="Root/Sensor" элемент контекста является элементом Sensor, поэтому любые пути внутри for-each должны относиться, например. <xsl:value-of select="position_x"/>.

+0

Hi Martin. Если я поставлю , )" id = "S"> Получаю: '< ', шестнадцатеричное значение 0x3C, является недопустимым символом атрибута. Я не уверен, как я могу отформатировать значение XSL: значение, которое должно быть помещено в строку преобразования. – Family

Смежные вопросы