Используйте переменную для хранения и вывода атрибутов - PullRequest
2 голосов
/ 20 марта 2012

Если у вас большой блок «xsl: выбрать», в котором мне нужно установить несколько определенных наборов атрибутов для разных элементов.

Я действительно не люблю повторять определение наборов атрибутов внутри каждой ветви «выбора». Поэтому я хотел бы работать с переменной, которая содержит эти атрибуты. Намного проще в обслуживании и меньше места для ошибок ...

До сих пор я не смог вызвать узел атрибута? Я думал, что это просто набор узлов, поэтому copy-of сделает свое дело.
Но это ничего не дает мне на выходе.
Это потому, что атрибутивные узлы на самом деле не дочерние?
Но XSLT 1.O не позволяет мне обращаться к ним напрямую ... <xsl:copy-of select="$attributes_body/@*/> возвращает ошибку

Вот фрагмент таблицы стилей (сокращено от оригинала)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="list">
  <xsl:for-each select="figure">
  <xsl:variable name="attributes_body">
     <xsl:attribute name="chapter"><xsl:value-of select="@chapter"/></xsl:attribute>
     <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
   </xsl:variable>
   <xsl:variable name="attributes_other">
      <xsl:attribute name="chapter"><xsl:value-of select="@book"/></xsl:attribute>
      <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
   </xsl:variable>
    <xsl:choose>
       <xsl:when test="ancestor::body">
          <xsl:element name="entry">
            <xsl:copy-of select="$attributes_body"/>
            <xsl:text>Body fig</xsl:text>
          </xsl:element>
       </xsl:when>
       <xsl:otherwise>
          <xsl:element name="entry">
            <xsl:copy-of select="$attributes_other"/>
            <xsl:text>other fig</xsl:text>
          </xsl:element>
       </xsl:otherwise>
    </xsl:choose>         
  </xsl:for-each>    
</xsl:template>

Если это невозможно сделать в XLST 1.0, сможет ли 2.0 это сделать?

Ответы [ 2 ]

4 голосов
/ 20 марта 2012
<xsl:variable name="attributes_body"> 
     <xsl:attribute name="chapter"><xsl:value-of select="@chapter"/></xsl:attribute> 
     <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> 
 </xsl:variable>

Вам необходимо выбрать требуемые атрибуты - чтобы не копировать их содержимое в тело переменной.

Помните : Всегда, когда это возможно, старайтесь всегда указывать выражение XPath в атрибуте select xsl:variable - избегайте копирования содержимого в его теле.

Решение :

Просто используйте :

<xsl:variable name="attributes_body" select="@chapter | @id"> 

Вот полный пример :

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

     <xsl:template match="x/a">
      <xsl:variable name="vAttribs" select="@m | @n"/>

      <newEntry>
        <xsl:copy-of select="$vAttribs"/>
        <xsl:value-of select="."/>
      </newEntry>
     </xsl:template>
</xsl:stylesheet>

применительно к этому :

<x>
 <a m="1" n="2" p="3">zzz</a>
</x>

производит :

 <newEntry m="1" n="2">zzz</newEntry>
1 голос
/ 13 июня 2017

в моем случае я пытался store тег attribute в variable

, чтобы сделать это, используйте этот синтаксис tag-name/@attribute-inside-tag-name

вот пример

<xsl:variable name="articleLanguage" select="/article/@language"/><!--the tricky part  -->
//<!--now you can use this this varialbe as you like  -->
<xsl:apply-templates select="front/article-meta/kwd-group[@language=$articleLanguage]"/>

и xml был

<article article-type="research-article" language="es" explicit-lang="es" dtd-version="1.0"> 
.....

надеюсь, что это поможет вам

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