2012-02-22 4 views
1

Я пытаюсь преобразовать следующий XML ..XSLT извлечения атрибутов и генерации HTML

<?xml version="1.0" encoding="utf-16"?><Member TextRank="unknown" FullName="My Name" ..etc.. /> 

В чем-то вроде следующего,

<div class="member"> 
    <span class="label"> 
     Text Rank (note: i want to override the labels in the xslt) 
    </div> 
    <span class="value"> 
     unknown 
    </span> 
    <span class="label"> 
     Full Name 
    </div> 
    <span class="value"> 
     My Name 
    </span> 
    ..etc.. 
</div> 

Как если это возможно, я мог бы сделать это с помощью XSLT?

ответ

1

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

Чтобы избежать повторений кода, вы можете также сделать общий шаблон именованного шаблон с параметром для переопределяет имя

<xsl:template match="@*" name="attribute"> 
    <xsl:param name="label" select="local-name()" /> 

Таким образом, по умолчанию для большинства атрибутов будет использовать имя атрибута, но конкретный шаблон для @FullName мог бы назвать это с другим именем.

<xsl:template match="@FullName"> 
    <xsl:call-template name="attribute"> 
     <xsl:with-param name="label" select="'Full Name'" /> 
    </xsl:call-template> 
</xsl:template> 

Вот полный XSLT:

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

    <xsl:template match="*"> 
     <div class="{local-name()}"> 
     <div> Title: </div> 
     <xsl:apply-templates select="@*"/> 
     </div> 
    </xsl:template> 

    <xsl:template match="@FullName"> 
     <xsl:call-template name="attribute"> 
     <xsl:with-param name="label" select="'Full Name'" /> 
     </xsl:call-template> 
    </xsl:template> 

    <xsl:template match="@*" name="attribute"> 
     <xsl:param name="label" select="local-name()" /> 
     <span class="label"> 
     <xsl:value-of select="concat($label, ' : ')"/> 
     </span> 
     <span class="value"> 
     <xsl:value-of select="."/> 
     </span> 
     <br/> 
    </xsl:template> 
</xsl:stylesheet> 

При нанесении на следующий XML:

<Member TextRank="unknown" ID="12" FullName="My Name" Dob="01/01/1970" /> 

Ниже выход:

<div class="Member"> 
    <div> Title: </div> 
    <span class="label">TextRank : </span> 
    <span class="value">unknown</span> 
    <br> 
    <span class="label">ID : </span> 
    <span class="value">12</span> 
    <br> 
    <span class="label">Full Name : </span> 
    <span class="value">My Name</span> 
    <br> 
    <span class="label">Dob : </span> 
    <span class="value">01/01/1970</span> 
    <br> 
</div> 
0

Это решение, с которым я столкнулся.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output indent="yes" /> 
    <xsl:template match="*"> 
     <xsl:element name="div"> 
      <xsl:attribute name="class">className</xsl:attribute> 
      <div> 
       Title: 
      </div> 

      <!-- UID, Name, DBO--> 
      <xsl:apply-templates select="@ID"/> 
      <xsl:apply-templates select="@FullName"/> 
      <xsl:apply-templates select="@Dob"/> 

     </xsl:element> 

    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:element name="span"> 

      <xsl:attribute name="class">label</xsl:attribute> 
      <xsl:choose> 
       <xsl:when test="name() = 'FullName'"> 
        Full Name 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="name()"/> 
       </xsl:otherwise> 
      </xsl:choose> 
      : 
     </xsl:element> 
     <xsl:element name="span"> 
      <xsl:attribute name="class">value</xsl:attribute> 
      <xsl:value-of select="."/> 
     </xsl:element> 
     <br/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Чтобы сохранить свой код понятнее , вы должны написать свои элементы/атрибуты непосредственно вместо usi ng 'xsl: element' и' xsl: attribute'. –

Смежные вопросы