xslt (таблица) путем сопоставления значения атрибута - PullRequest
0 голосов
/ 14 марта 2010

Мне нужно сгенерировать таблицу xsl для XML ниже, для атрибутов fname и lname. Я думаю, что я сделал что-то не так в xpath. Может ли кто-нибудь помочь мне, написав таблицу xsl для xml ниже ...

<sparql>
    <head>
        <variable name="s"/>
        <variable name="fname"/>
        <variable name="lname"/>
    </head>
    <results>
        <result>
            <binding name="s">
                <uri>http://tn.gov.in/Person/41</uri>
            </binding>
            <binding name="fname">
                <literal>G</literal>
            </binding>
            <binding name="lname">
                <literal>Vn</literal>
            </binding>
        </result>
        <!-- more result elements -->
    </results>
</sparql>

как у меня есть сервлет, который запрашивает семантические данные, используя jena ... вывод сервлета выше xml ... при настройке формата вывода у Jena есть опция, в которой можно стилизовать XML, отображая файл xsl ..

теперь, когда я использовал пример Лахлана, я получил вывод, как я написал в этом комментарии .. ничего, мой вывод должен быть в форме таблицы, в которой должны отображаться fname, lname

как

fname             lname
------------------------
M           v
G         v

и т.д ...

какую ошибку я должен был совершить? это мой xsl:

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

    <xsl:template match="sparql/results">
        <html>
            <head><title>persons</title>
            </head>
            <body>
                <table width="40%" border="1">
                    <THEAD>
                        <TR>
                            <TD><B>first name</B></TD>
                            <TD><B>last name</B></TD>
                        </TR>
                    </THEAD> 
                    <TBODY>
                        <xsl:for-each select="result">
                            <TR>    
                                <TD><xsl:value-of select="binding[@name='fname']/literal/text()" /></TD>     
                                <TD><xsl:value-of select="binding[@name='fname']/literal/text()" /></TD> 

                            </TR>
                        </xsl:for-each>
                    </TBODY>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

Мой вывод:

http://tn.gov.in/Person/41 Gn http://tn.gov.in/Person/43 Vn http://tn.gov.in/Person/37 Mn http://tn.gov.in/Person/39 Vn

я не помещаю имя = 's' в определение xsl .. но я получаю это также в выводе, который также не форматируется как таблица ..

ДА У меня есть пространство для корня sparql ..

<sparql xmlns="http://www.w3.org/2005/sparql-results#">
  <head>
    <variable name="s"/>
    <variable name="fname"/>
    <variable name="lname"/>
    <variable name="title"/>
    <variable name="mno"/>
    <variable name="community"/>

  </head>
  <results>
    <result>
      <binding name="s">
        <uri>http://tn.gov.in/Person/45</uri>
      </binding>
      <binding name="fname">
        <literal>/literal>

      </binding>
      <binding name="lname">
        <literal>K</literal>
      </binding>
      <binding name="title">
        <literal>Mr.</literal>
      </binding>
      <binding name="mno">

        <literal>876876</literal>
      </binding>
      <binding name="community">
        <literal>Fe</literal>
      </binding>
    </result>

как мне теперь соответствовать шаблону?

Ответы [ 2 ]

1 голос
/ 14 марта 2010

Я не пробовал ответить Лахлана, но он выглядит хорошо для меня. Я быстро соединил это, что дает результат, который вы запрашивали (он не слишком отличается, и я не делал никакого форматирования).

<xsl:output method="html"/>

<xsl:template match="/">
    <html>
        <head></head>
        <body>
            <xsl:apply-templates></xsl:apply-templates>
        </body>
    </html>
</xsl:template>

<xsl:template match="results">
    <table>
        <tr>
            <th>Fname</th>
            <th>Lname</th>
        </tr>
        <xsl:for-each select="result">
            <tr>
                <td><xsl:value-of select="binding[@name='fname']"/></td>
                <td><xsl:value-of select="binding[@name='lname']"/></td>
            </tr>
        </xsl:for-each>    
    </table>
</xsl:template>

1 голос
/ 14 марта 2010

Ваша таблица стилей имеет только одно шаблонное правило: match="sparql/results", которое должно соответствовать. Содержит ли входной документ пространства имен, которые не показаны в примере?

Если ваши элементы xml находятся в пространстве имен, даже если это пространство имен по умолчанию для документа, вы должны использовать префиксы пространства имен в любых выражениях XPath и правилах сопоставления шаблонов. Это имя URI, а не префикс, который имеет значение. Обратите внимание, что атрибуты не будут находиться в пространстве имен по умолчанию, они имеют пространство имен только в том случае, если их имя имеет префикс.

<xsl:stylesheet version="1.0"
                xmlns:s="http://www.w3.org/2005/sparql-results#"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="s:results">

Встроенные в шаблон правила генерируют вывод, который вы видели, так как они:

  • сопоставить все шаблоны и выполнить apply-templates
  • копировать текстовые узлы для вывода

Я добавил правило, соответствующее /, и затем явно выбираю нужные элементы на каждом шаге.

В этом примере из вашего ввода создается таблица HTML, содержащая столбцы для имени и фамилии.

<xsl:stylesheet version="1.0"
    xmlns:s="http://www.w3.org/2005/sparql-results#"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="UTF-8"/>

    <xsl:template match="/">
        <html>
            <head><title>persons</title>
            </head>
            <body>
                <xsl:apply-templates select="s:sparql/s:results" />
            </body>
        </html>
    </xsl:template>


    <xsl:template match="s:results">
        <table>
            <thead>
                <tr>
                    <td>
                        <xsl:text>Link</xsl:text>
                    </td>
                    <td>
                        <xsl:text>First name</xsl:text>
                    </td>
                    <td>
                        <xsl:text>Last name</xsl:text>
                    </td>
                </tr>
            </thead>
            <tbody>
                <xsl:apply-templates />
            </tbody>
        </table>
    </xsl:template>

    <xsl:template match="s:result">
        <tr>
            <td>
                <a href="{s:binding[@name='s']/s:uri}">
                    <xsl:value-of select="s:binding[@name='s']/s:uri" />
                </a>
            </td>
            <td>
                <xsl:value-of select="s:binding[@name='fname']/s:literal" />
            </td>
            <td>
                <xsl:value-of select="s:binding[@name='lname']/s:literal" />
            </td>
        </tr>
    </xsl:template>

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