Отображать различные XML в JSF (используя XSLT или другое предложение) - PullRequest
1 голос
/ 18 апреля 2010

Во время выполнения я получаю XML-документ и хочу, чтобы он отображался как-то иначе в JSF. Например:

Это:

<invoker.ArrayOfDictionary>
  <dictionary>
    <invoker.Dictionary>
      <id>gcide</id>
      <name>The Collaborative International Dictionary of English v.0.48</name>
    </invoker.Dictionary>
    <invoker.Dictionary>
      <id>wn</id>
      <name>WordNet (r) 2.0</name>
    </invoker.Dictionary>
    <invoker.Dictionary>
      <id>moby-thes</id>
      <name>Moby Thesaurus II by Grady Ward, 1.0</name>
    </invoker.Dictionary>

в этом:

invoker.ArrayOfDictionary:
  dictionary:
    invoker.Dictionary:
      id:gcide
      name:The Collaborative International Dictionary of English v.0.48
    invoker.Dictionary:
      id:wn
      name:WordNet (r) 2.0
    invoker.Dictionary:
      id:moby-thes
      name:Moby Thesaurus II by Grady Ward, 1.0

Я думал сделать это с помощью преобразования XSLT. Некоторые рекомендации, как начать с xslt? Или, может быть, у вас есть другая идея для этого?

решаемые

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
        <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:variable name="vNL" select="'&#xA;'"/>
    <xsl:variable name="vSpaces" select="'          '"/>
    <xsl:template match="*">
       <xsl:value-of select="concat(
    $vNL,
    substring($vSpaces,1,count(ancestor::node())),
    $startBold,
    name(),
    ':')"/>
       <xsl:apply-templates/>
     </xsl:template>
    </xsl:stylesheet>

1 Ответ

2 голосов
/ 19 апреля 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my"
>
 <xsl:output method="text"/>

 <xsl:strip-space elements="*"/>

 <my:offsets>
   <offset value="0">
     <element name="invoker.ArrayOfDictionary"/>
   </offset>
   <offset value="2">
     <element name="dictionary"/>
   </offset>
   <offset value="4">
     <element name="invoker.Dictionary"/>
   </offset>
   <offset value="6">
     <element name="name"/>
     <element name="id"/>
   </offset>
 </my:offsets>

 <xsl:variable name="vOffsets"
      select="document('')/*/my:offsets"/>

 <xsl:variable name="vNL" select="'&#xA;'"/>

 <xsl:variable name="vSpaces"
      select="'          '"/>

 <xsl:template match="*">
   <xsl:variable name="vthisOffset" select=
   "$vOffsets/*
          [element/@name
          =
           name(current())
           ]
            /@value
   "/>
   <xsl:value-of select=
   "concat($vNL,
           substring($vSpaces,1,$vthisOffset),
           name(),
           ':'
           )"
   />
   <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным) :

<invoker.ArrayOfDictionary>
  <dictionary>
    <invoker.Dictionary>
      <id>gcide</id>
      <name>The Collaborative International Dictionary of English v.0.48</name>
    </invoker.Dictionary>
    <invoker.Dictionary>
      <id>wn</id>
      <name>WordNet (r) 2.0</name>
    </invoker.Dictionary>
    <invoker.Dictionary>
      <id>moby-thes</id>
      <name>Moby Thesaurus II by Grady Ward, 1.0</name>
    </invoker.Dictionary>
  </dictionary>
</invoker.ArrayOfDictionary>

дает желаемый, правильный результат :

invoker.ArrayOfDictionary:
  dictionary:
    invoker.Dictionary:
      id:gcide
      name:The Collaborative International Dictionary of English v.0.48
    invoker.Dictionary:
      id:wn
      name:WordNet (r) 2.0
    invoker.Dictionary:
      id:moby-thes
      name:Moby Thesaurus II by Grady Ward, 1.0

Примечание :

  1. Использование method="text" в инструкции <xsl:output>.

  2. Все смещения определены для всех элементов в удобном дереве, которое можно сохранить в отдельном файле и изменить без необходимости касаться кода XSLT.

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