XSL-преобразование для WTF "хорошо сформированный" пример - PullRequest
3 голосов
/ 23 августа 2010

Я громко рассмеялся, когда прочитал эту статью на Daily WTF: http://thedailywtf.com/Articles/WellFormed-XML.aspx,, но теперь это уже не смешно, потому что я начал распознавать этот «шаблон дизайна XML» в дикой природе с пугающей частотой. например, я просто экспортировал некоторые данные из рационального запроса clearquest и получил это:

<?xml version="1.0" encoding="us-ascii"?>
<?xml-stylesheet type="text/xsl" href="http://scm/rational/clearquest/webservice/resultset.xsl"?>
<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs">
  <header count="3">
    <column type="dbid">dbid</column>
    <column type="id">id</column>
    <column type="short_string">Abstract</column>
  </header>
  <record>
    <field>33607697</field>
    <field>PROD00011111</field>
    <field>The product has a bug that needs fixed.</field>
  </record>
</resultset>

Я не волшебник xslt - возможно, рано или поздно я это выясню, но не мешало бы спросить ... каков самый простой шаблон xslt для преобразования вышеупомянутого в нечто более полезное, например:

<?xml version="1.0" encoding="us-ascii"?>
<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs">
  <record>
    <dbid type="dbid">33607697</dbid>
    <id type="id">PROD00011111</id>
    <Abstract type="short_string">The product has a bug that needs fixed.</Abstract>
  </record>
</resultset>

1 Ответ

1 голос
/ 24 августа 2010

Следующее преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kColByPos" match="column"
  use="count(preceding-sibling::*) +1"/>

 <xsl:template match="/*">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates select="record"/>
  </xsl:copy>
 </xsl:template>

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

 <xsl:template match="field">
  <xsl:variable name="vColumn" select=
   "key('kColByPos', position())"/>

   <xsl:element name="{translate($vColumn, ' ', '_'}">
    <xsl:copy-of select="$vColumn/@type"/>
    <xsl:apply-templates/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs">
  <header count="3">
    <column type="dbid">dbid</column>
    <column type="id">id</column>
    <column type="short_string">Abstract</column>
  </header>
  <record>
    <field>33607697</field>
    <field>PROD00011111</field>
    <field>The product has a bug that needs fixed.</field>
  </record>
</resultset>

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

<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs">
    <record>
        <dbid type="dbid">33607697</dbid>
        <id type="id">PROD00011111</id>
        <Abstract type="short_string">The product has a bug that needs fixed.</Abstract>
    </record>
</resultset>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...