使用变量来存储和输出属性

时间:2012-03-20 11:04:09

标签: xslt

如果有一个很大的'xsl:choose'块,我需要在不同的元素上设置一些已定义的属性集。

我真的不喜欢在'choose'的每个分支内重复定义属性集。 所以我想使用包含这些属性的变量。 维护起来容易得多,错误的余地也很小......

到目前为止,我还无法调用属性节点? 我认为它们只是一个节点集,因此副本可以解决问题 但这对我的输出没有任何帮助 这是因为属性节点不是真正的孩子吗? 但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 个答案:

答案 0 :(得分:4)

<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>

您需要选择所需的属性 - 而不是将其内容复制到变量的主体中。

请记住:尽可能尝试始终在select的{​​{1}}属性中指定XPath表达式 - 避免在其正文中复制内容。

<强>解决方案

只需使用

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>

答案 1 :(得分:1)

在我的情况下,我试图storeattribute标记转换为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"> 
.....

希望这能帮到你