вывод XML инкапсулированного литерала с использованием XSLT - PullRequest
2 голосов
/ 27 февраля 2010

Я хочу преобразовать файл RDF / XML в таблицу из 3 столбцов, а именно «Тема», «Предикат» и «Объект», они известны как тройки RDF.

Файл RDF / XML показан ниже:

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:h="http://www.w3.org/1999/xhtml">
  <rdf:Description rdf:about="http://www.w3.org/TR/2004/REC-rdf-mt-20040210/">
    <dc:title xmlns:dc="http://purl.org/dc/elements/1.1/">RDF Semantics - W3C Recommendation 10 February 2004</dc:title>
  </rdf:Description>
  <rdf:Description rdf:about="http://www.w3.org/TR/2004/REC-rdf-mt-20040210/">
    <dc:creator rdf:resource="#a1" xmlns:dc="http://purl.org/dc/elements/1.1/" />
  </rdf:Description>
  <rdf:Description rdf:about="#a1">
    <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person" />
  </rdf:Description>
  <rdf:Description rdf:about="#a1">
    <foaf:name xmlns:foaf="http://xmlns.com/foaf/0.1/">Patrick Hayes</foaf:name>
  </rdf:Description>
  <rdf:Description rdf:about="#a1">
    <foaf:homepage rdf:resource="http://www.ihmc.us/users/user.php?UserID=42" xmlns:foaf="http://xmlns.com/foaf/0.1/" />
  </rdf:Description>
</rdf:RDF>

и XSLT, который я создал:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
<xsl:template match="/">
<html>
<body>

  <table border="1">
    <tr bgcolor="#5d7b9d" >
      <th style="color: white">Subject</th>
      <th style="color: white">Predicate</th>
      <th style="color: white">Object</th> 
    </tr>


    <xsl:for-each select="rdf:RDF/rdf:Description">
    <tr>

      <td><xsl:value-of select="@rdf:about"/></td>

 <xsl:for-each select="*"> 
  <td><xsl:value-of select="name()"/></td>
  <td><xsl:value-of select="@rdf:resource"/>
      <xsl:value-of select="//*/rdf:Description"/>
  </td>
 </xsl:for-each>

    </tr>
    </xsl:for-each>
  </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

с помощью XSLT я смог получить правильные результаты для Subject, Predicate, но не для Object, потому что некоторые объекты являются литералом, инкапсулированным в элементах XML. Я попытался использовать xsl: value-of select = "// * / rdf: Description" /, но он просто возвращает все литералы документа. Пожалуйста, помогите, спасибо.

1 Ответ

2 голосов
/ 27 февраля 2010

<xsl:value-of select="*/."/> или <xsl:value-of select="*/text()"/> должны сделать трюк, так как вы находитесь в области действия Описание и ищете содержимое описания.

Оба выбора возвращают конкатенацию всех текстов внутри дочерних элементов. Если у вас есть структура внутри ваших элементов Description, вам, возможно, придется изменить стиль, чтобы включить это.

В более стиле "xsl afine", то есть без использования циклов for-each, но шаблонов стилей будет выглядеть так:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
    <xsl:output method="html"/>
    <xsl:template match="/">
        <html>
            <body>

                <table border="1">
                    <tr bgcolor="#5d7b9d" >
                        <th style="color: white">Subject</th>
                        <th style="color: white">Predicate</th>
                        <th style="color: white">Object</th>
                    </tr>

                    <xsl:apply-templates select="rdf:RDF/rdf:Description"/>
                </table>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="rdf:RDF/rdf:Description">
        <tr>
            <td>
                <xsl:value-of select="@rdf:about"/>
            </td>
            <td>
                <xsl:value-of select="name()"/>
            </td>
            <td>
                <xsl:choose>
                    <xsl:when test="*/@rdf:resource">
                    <xsl:value-of select="*/."/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="*/."/>
                </xsl:otherwise>
            </xsl:choose>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

В этой таблице стилей, ИМХО, становится понятнее, какова фактическая область оценки.

Если вы хотите быть уверены, что отображается только ресурс или контент, а также иметь дело с несколькими элементами, вы можете изменить приведенную выше таблицу стилей следующим образом:

<xsl:template match="rdf:RDF/rdf:Description">
    <tr>
        <td>
            <xsl:value-of select="@rdf:about"/>
        </td>
        <td>
            <xsl:value-of select="name()"/>
        </td>
        <td>
            <xsl:apply-templates select="rdf:RDF/rdf:Description/*"/>
        </td>
    </tr>
</xsl:template>

<xsl:template match="rdf:RDF/rdf:Description/*">
    <!-- implements either or -->
    <xsl:choose>
        <xsl:when test="*/@rdf:resource">
            <xsl:value-of select="*/."/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="*/."/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...