Переименование элементов XML с использованием XSLT - PullRequest
2 голосов
/ 10 апреля 2009

Мне нужно изменить некоторые имена элементов в исходном XML. Я пытаюсь сделать это с XSLT, но не могу заставить его работать.

Вот пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="test.xsl" type="text/xsl"?>
<html>
<body>
    <section>Jabber</section>       
            <itemtitle>JabberJabber</itemtitle>
                    <p>Always Jabber Jabber Jabber</p>
            <h3>Emboldened Requests </h3>
                    <p>Somemore Jabber Here</p>
                    <img scr="bigpicture.jpg"></img>
            <poll><p>Which statement best characterizes you?</p></poll>
            <pcredit>Left: Jumpin Jasper/Jumpy Images</pcredit>
</body>
</html>

Мне нужно изменить его на:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="test.xsl" type="text/xsl"?>
<html>
<body>
   <div class="issuehead">Jabber</div>   
   <div class="issuetitle">JabberJabber</div>
      <p>Always Jabber Jabber Jabber</p>
   <h3>Emboldened Requests </h3>
      <p>Somemore Jabber Here</p>
   <img scr="bigpicture.jpg"></img>
   <div class="poll"><p>Which statement best characterizes you?</p></div>
   <div class="pcredit">Left: Jumpin Jasper/Jumpy Images</div>
</body>
</html>

Вот XSLT, который я сделал, но я не могу заставить его работать:

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

<xsl:output method="html" />

<xsl:template match="/">

<html>
<head>  
</head>
<body>
   <xsl:apply-templates/>
</body>    
</html>

  <xsl:template match="section">
    <div class="issuehead"><xsl:value-of select="."/></div>
  </xsl:template>

  <xsl:template match="itemtitle">
    <div class="issuetitle"> <xsl:value-of select="."/></div>
  </xsl:template>

  <xsl:template match="img"></xsl:template>

  <xsl:template match="poll">
    <div class="poll"><xsl:value-of select="."/></div>
  </xsl:template>

  <xsl:template match="pcredit">
    <div class="pcredit"><xsl:value-of select="."/></div>
  </xsl:template>

  <xsl:template match="p"></xsl:template>

  <xsl:template match="h3"></xsl:template>

 </xsl:template>
</xsl:stylesheet>

Спасибо за помощь!

Ответы [ 2 ]

10 голосов
/ 10 апреля 2009

Для чего-либо подобного, начните с преобразования личности :

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

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

</xsl:stylesheet>  

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

<xsl:template match="section"> 
  <div class="issuehead">
      <xsl:apply-templates select="@* | node( )"/>
  </div>
</xsl:template>

Этот шаблон должен дать вам то, что вы хотите.

2 голосов
/ 10 апреля 2009

Следующий шаблон достигает желаемого результата:

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

    <xsl:output method="html" />

    <!-- Copy all elements and attributes from the source to the target -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <!-- Transform the given elements to divs with class names matching the source element names -->
    <xsl:template match="itemtitle|poll|pcredit">
        <div class="{local-name(.)}">
          <xsl:value-of select="."/>
        </div>
    </xsl:template>

    <!-- Transform the section element to a div of class 'issuehead' -->
    <xsl:template match="section">
        <div class="issuehead">
            <xsl:value-of select="."/>
        </div>
    </xsl:template>

</xsl:stylesheet> 

Если вы хотите более правильно сформированную разметку, измените тег xsl: output следующим образом:

<xsl:output method="xml" 
    version="1.0" 
    encoding="UTF-8" 
    indent="yes" 
    omit-xml-declaration="yes" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...