Преобразование документа XML в новый файл XML с помощью XSLT - PullRequest
1 голос
/ 26 января 2011

Я пытаюсь переназначить файл XML с помощью XSLT, но я не знаком с тем, как XSLT выполняет этот процесс.В основном мне нужно преобразовать следующий xml:

<rows>
<row>
<site id>My Website</site id>
<pageName>Homepage</pageName>
<channel>microsite</channel>
<tree>mywebsite/subsite/homepage</tree>
<url name>brand name</url name>
<urltype>2</urltype>
<spec4>{lang}</spec4>
<spec6>company:section:homepage</spec6>
<spec11>ms:plinth</spec11>
<spec12>2010</spec12>
<spec14>company-{country}</spec14>
<spec15>site:brand name</spec15>
<spec16>Brand Name</spec16>
<spec18></spec18>
<spec30>site:brand name</spec30>
<add4>{lang}</add4>
<add5>ref:company</add5>
<add6>company:section:homepage</add6>
<add11>ms:plinth</add11>
<add12>2010</add12>
<add14>company-{country}</add14>
<add15>site:brand name</add15>
<add16>Brand Name</add16>
<add30>site:brand name</add30>
<actions4>action 1</actions4>
<actions5>action 3</actions5>
</row>
</rows>

в более структурированный:

<siteSpecific>
<site id="My Website" urlType="page">
  <general>
    <pageName>ms:sbe:Brand Name:tdr</pageName>
    <channel>microsite</channel>
    <tree>mywebsite/subsite/homepage</tree>
    <urlName>referral:brand</urlName>
    <urlType>2</urlType>
  </general>
  <specs>
    <spec4>{lang}</spec4>
    <spec6>company:section:homepage</spec6>
    <spec11>ms:plinth</spec11>
    <spec12>2010</spec12>
    <spec14>company-{country}</spec14>
    <spec15>site:brand name</spec15>
    <spec16>Brand Name</spec16>
    <spec30>site:brand name</spec30>
  </specs>
  <adds>
    <add4>{lang}</add4>
    <add5>ref:company</add5>
    <add6>company:section:homepage</add6>
    <add11>ms:plinth</add11>
    <add12>2010</add12>
    <add14>company-{country}</add14>
    <add15>site:brand name</add15>
    <add16>Brand Name</add16>
    <add30>site:brand name</add30>
  </adds>
  <actions>
    <actions4>action 1</actions4>
    <actions5>action 3</actions5>
  </actions>
</site>
</siteSpecific>

Может ли кто-нибудь указать мне правильное направление?Я видел подобные посты, но они довольно старые, и поскольку XSLT, кажется, не используется в этих целях в эти дни, я также задавался вопросом, является ли это лучшим вариантом?

1 Ответ

2 голосов
/ 26 января 2011

Имена, такие как site id, не допускаются в XML, поэтому мне пришлось сделать некоторые предположения относительно вашего входного XML.Если предположить, что это

<rows>
<row>
<site_id>My Website</site_id>
<pageName>Homepage</pageName>
<channel>microsite</channel>
<tree>mywebsite/subsite/homepage</tree>
<url_name>brand name</url_name>
<urltype>2</urltype>
<spec4>{lang}</spec4>
<spec6>company:section:homepage</spec6>
<spec11>ms:plinth</spec11>
<spec12>2010</spec12>
<spec14>company-{country}</spec14>
<spec15>site:brand name</spec15>
<spec16>Brand Name</spec16>
<spec18></spec18>
<spec30>site:brand name</spec30>
<add4>{lang}</add4>
<add5>ref:company</add5>
<add6>company:section:homepage</add6>
<add11>ms:plinth</add11>
<add12>2010</add12>
<add14>company-{country}</add14>
<add15>site:brand name</add15>
<add16>Brand Name</add16>
<add30>site:brand name</add30>
<actions4>action 1</actions4>
<actions5>action 3</actions5>
</row>
</rows>

, то таблица стилей

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

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

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

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

  <xsl:template match="row">
    <site id="{site_id}" urlType="page">
      <general>
        <xsl:apply-templates select="pageName | channel | tree | url_name | urltype"/>
      </general>
      <specs>
        <xsl:apply-templates select="*[starts-with(local-name(), 'spec')]"/>
      </specs>
      <adds>
        <xsl:apply-templates select="*[starts-with(local-name(), 'add')]"/>
      </adds>
      <actions>
        <xsl:apply-templates select="*[starts-with(local-name(), 'action')]"/>
      </actions>
    </site>
  </xsl:template>

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

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

</xsl:stylesheet>

создает следующий вывод:

<siteSpecific>
   <site id="My Website" urlType="page">
      <general>
         <pageName>Homepage</pageName>
         <channel>microsite</channel>
         <tree>mywebsite/subsite/homepage</tree>
         <urlName>brand name</urlName>
         <urlType>2</urlType>
      </general>
      <specs>
         <spec4>{lang}</spec4>
         <spec6>company:section:homepage</spec6>
         <spec11>ms:plinth</spec11>
         <spec12>2010</spec12>
         <spec14>company-{country}</spec14>
         <spec15>site:brand name</spec15>
         <spec16>Brand Name</spec16>
         <spec18/>
         <spec30>site:brand name</spec30>
      </specs>
      <adds>
         <add4>{lang}</add4>
         <add5>ref:company</add5>
         <add6>company:section:homepage</add6>
         <add11>ms:plinth</add11>
         <add12>2010</add12>
         <add14>company-{country}</add14>
         <add15>site:brand name</add15>
         <add16>Brand Name</add16>
         <add30>site:brand name</add30>
      </adds>
      <actions>
         <actions4>action 1</actions4>
         <actions5>action 3</actions5>
      </actions>
   </site>
</siteSpecific>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...