Нужно прочитать дочерние значения предыдущего узла, чтобы отформатировать значение текущего узла, используя xsl? - PullRequest
0 голосов
/ 23 сентября 2011

Мне нужно использовать тег форматов при отображении содержимого строк данных в тегах строк данных.

xml выглядит следующим образом: "temp.xml"

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="Temp.xsl"?>
<ALL_DATA>
    <TITLES>
        <VALUE1>Title1</VALUE1>
        <VALUE2>Title2</VALUE2>
        <FVALUE1>Title3</FVALUE1>
    </TITLES>
    <FORMATS>
        <VALUE1>I5</VALUE1>
        <VALUE2>I3</VALUE2>
        <FVALUE1>F1.1</FVALUE1>
    </FORMATS>
    <MY_DATA>
        <ROWDATA>
            <VALUE1>5</VALUE1>
            <VALUE2>33</VALUE2>
            <FVALUE1>2.11</FVALUE1>
        </ROWDATA>
        <ROWDATA>
            <VALUE1>34</VALUE1>
            <VALUE2>12</VALUE2>
            <FVALUE1>239.81</FVALUE1>
        </ROWDATA>
    </MY_DATA>
</ALL_DATA>

и я попробовал xsl: "temp.xsl"

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  <xsl:template name="MY_TEMPLATE" match="/">
    <html>
      <body>
        <table border="1">
          <TR border="1">
            <xsl:for-each select="/ALL_DATA/TITLES/*">
              <th border="1">
                <xsl:value-of select="."/>
              </th>
            </xsl:for-each>
          </TR>
          <xsl:for-each select="/ALL_DATA/MY_DATA/ROWDATA">
            <TR>
              <xsl:for-each select="*">
                <TD width ="130">
                  <xsl:value-of select="."/>:-:
                  <xsl:variable name="cur_node_name" select="name(.)"/>
                  <xsl:for-each select="/ALL_DATA/FORMATS[name(.)]">
                   <!--<xsl:template match="$cur_node_name"> -->
                  <xsl:value-of select="."/>
                   <!--</xsl:template>-->
                </xsl:for-each>
                </TD>
              </xsl:for-each>
            </TR>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Прошу прощения за публикацию всего контента. Я чувствую, что могу получить помощь. В приведенном выше XML, я хочу использовать форматы / значение1 при отображении Mydata / rowdata / value1. Выше Xsl повторяет блок заголовков и отображает заголовки в <th>. и затем второй блок for-each будет перебирать строки данных и их дочерние элементы. При отображении дочерних элементов мне нужно использовать теги format для отображения дочерних элементов rowdata.

Приведенный выше xsl дает вывод для 3-го тега FValue1 как: "2.11:-: I5 I3 F1.1"; Но мое ожидание: "2.11:-: F1.1". Если я получу это решение, я могу сделать все остальное. Я знаю, просто изменив внутренний цикл for, это возможно. но не смог получить это

Пожалуйста, помогите, если у кого-нибудь есть предложения, как это сделать. Благодарю.

1 Ответ

0 голосов
/ 26 сентября 2011

Если вы не слишком упрощаете пример данных, ваш xslt может вообще отбросить for-each и выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
        <html>
            <body>
                <table border="1">
                    <xsl:apply-templates select="TITLES" />
                    <xsl:apply-templates />
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="TITLES">
        <tr>
            <th><xsl:value-of select="./VALUE1" /></th>
            <th><xsl:value-of select="./VALUE2" /></th>
            <th><xsl:value-of select="./FVALUE1" /></th>
        </tr>
    </xsl:template>

    <xsl:template match="ROWDATA">
        <tr>
            <td>
                <xsl:value-of select="./VALUE1" />:-:<xsl:value-of select="//FORMATS/VALUE1" />
            </td>
            <td>
                <xsl:value-of select="./VALUE2" />:-:<xsl:value-of select="//FORMATS/VALUE2" />
            </td>
            <td>
                <xsl:value-of select="./FVALUE1" />:-:<xsl:value-of select="//FORMATS/FVALUE1" />
            </td>
        </tr>
    </xsl:template>

    <xsl:template match="MY_DATA">
        <xsl:apply-templates />
    </xsl:template>

</xsl:stylesheet>
...