xslt模板 - 如何传入属性及其值?

xslt模板 - 如何传入属性及其值?

问题描述:

我正在使用一些XML,其中节点有很多属性,我正在使用XSL创建一个FO PDF文件(报告)。我正在尝试创建一个模板,该模板在当前节点上使用特定属性,并创建将具有一些基本格式的fo:blockxslt模板 - 如何传入属性及其值?

这是一个模板,它创建一个节点上所有属性和值的大表。

XSL:

<xsl:template name="createAttributeAndValueList"> 
    <xsl:param name="node" select="." /> 
    <xsl:for-each select="$node/@*"> 
     <fo:block> 
     <xsl:value-of select="concat(name(),': ')"/> 
     <xsl:value-of select="."/> 
     </fo:block> 
    </xsl:for-each> 
</xsl:template> 

然而,有些时候,我只想得到一个或两个这些属性出来的,而不是全部切断节点。我猜这是一件很明显的事情,但由于缺乏经验,我还没有弄清楚。

我想要做相同的格式,但我似乎无法得到正确的语法,能够将我的价值传递给参数,并得到我想要的。下面是我有:

XSL:

<xsl:template name="createAttributeValuePair"> 
    <xsl:param name="attribute" select="." /> 
    <xsl:for-each select="@*"> 
     <fo:block> 
     <xsl:value-of select="concat(name(),': ')"/> 
     <xsl:value-of select="."/> 
     </fo:block> 
    </xsl:for-each> 
</xsl:template> 

而这里的如何,我想叫它: XSL:

<fo:block font-weight="normal" margin-left="6pt"> 
    <xsl:call-template name="createAttributeValuePair"> 
     <xsl:with-param name="attribute"          
         select="/device:DevicePatientEncounter/device:Encounter/ 
            device:Followup/@UnderlyingRhythm"/> 
    </xsl:call-template> 
</fo:block> 

在我的XML看起来是这样的:

<DevicePatientEncounter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
         GeneratedTime="2011-12-14T13:36:05" 
         EncounterDate="2011-11-15T11:04:54" 
         xmlns="device"> 
    <Encounter> 
     <Followup UnderlyingRhythm="Sinus bradycardia" 
        UnderlyingRhythmRateBpm="44" 
        IsPmDependent="false" 
        PresentingRhythm="Atrial fibrillation" 
        BatteryChargeSeconds="5" 
        AutoCapFrequency="3 Years" 
        LastCapacitorFormDate="2011-10-25T00:00:00" 
        BatteryLongevity="0" 
        BatteryVoltage="11" 
        BatteryStatus="MOL"/> 
    </Encounter> 
</DevicePatientEncounter> 

几点说明:

  • 你传递一个属性createAttributeValuePair但你永远不带参数
  • 你在这个模板上循环@*做任何事情,但模板似乎旨在输出一个属性的名称和值
  • 此外,call-template不改变当前节点,所以它不是真的被清零迭代什么元素的属性在循环

我猜你正在寻找的东西是这样的:

<xsl:template name="createAttributeValuePair"> 
    <xsl:param name="attribute" select="."/> 
    <fo:block> 
     <xsl:value-of select="concat(name($attribute),': ')"/> 
     <xsl:value-of select="$attribute"/> 
    </fo:block> 
</xsl:template> 

下面是一个完整的演示:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:fo="http://www.w3.org/1999/XSL/Format" 
       xmlns:device="device"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:template match="/"> 
     <fo:block font-weight="normal" margin-left="6pt"> 
      <xsl:call-template name="createAttributeValuePair"> 
       <xsl:with-param name="attribute" 
         select="/device:DevicePatientEncounter/device:Encounter/ 
            device:Followup/@UnderlyingRhythm"/> 
      </xsl:call-template> 
     </fo:block> 
    </xsl:template> 
    <xsl:template name="createAttributeValuePair"> 
     <xsl:param name="attribute" select="."/> 
     <fo:block> 
      <xsl:value-of select="concat(name($attribute),': ')"/> 
      <xsl:value-of select="$attribute"/> 
     </fo:block> 
    </xsl:template> 
</xsl:stylesheet> 

以下输出时产生鉴于你的示例XML:

<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:device="device" 
      font-weight="normal" 
      margin-left="6pt"> 
    <fo:block>UnderlyingRhythm: Sinus bradycardia</fo:block> 
</fo:block>