xslt从节点引用中打印名称

时间:2014-08-14 19:37:11

标签: xslt

这是我第一次尝试xslt。

我正在设置要在PDF表单上打印的字段。

我有这个:

    <Field>
        <Name>Accident1_Name</Name>
        <Value>
            <xsl:value-of
                          select="PersPolicy/AccidentViolation[1]/@DriverRef" />
        </Value>
        <Type>Tx</Type>
    </Field>    

但这只是给我一个司机号码。

XML中的

看起来像这样

<AccidentViolation id="N196" DriverRef="N86" saved="true">
  <AccidentViolationCd id="N202">NO</AccidentViolationCd>
  <AccidentViolationDt id="N198">2012-04-05</AccidentViolationDt>
  <PlaceIncident id="N201">Tampa Florida</PlaceIncident>
  <ConvictionDt id="N199">2012-04-05</ConvictionDt>
  <AccidentViolationRecordTypeCd id="N200">AAM</AccidentViolationRecordTypeCd>
</AccidentViolation>

  <PersDriver id="N86" saved="true">
  <GeneralPartyInfo id="N88">
    <NameInfo id="N89">
      <PersonName id="N90">
        <Surname id="N93">Test</Surname>
        <GivenName id="N91">Mary</GivenName>
        <OtherGivenName id="N92">P</OtherGivenName>
      </PersonName>
      <CommlName id="N116">
        <CommercialName id="N117">School District</CommercialName>
      </CommlName>
    </NameInfo>
    <Addr id="N119">
      <AddrTypeCd id="N118">EmployerAddress</AddrTypeCd>
      <Addr1 id="N120">100 Applewild</Addr1>
      <City id="N121">Lady Lake</City>
      <StateProvCd id="N122">FL</StateProvCd>
      <PostalCode id="N123">33333-4444</PostalCode>
    </Addr>
  </GeneralPartyInfo>
</PersDriver>

如何让该字段显示&#39; Test Mary&#39;?

感谢您提供的任何帮助。很抱歉,如果这是另一个问题的重复,我也不太清楚要搜索的内容。

感谢帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用键执行此操作。将它放在XSLT顶部附近,xsl:stylesheet元素内以及任何xsl:template元素之外:

<xsl:key name="kPers" match="PersDriver" use="@id" />

然后你可以这样做:

<xsl:variable name="a1driver" 
              select="key('kPers', PersPolicy/AccidentViolation[1]/@DriverRef)" />
<Field>
    <Name>Accident1_Name</Name>
    <Value>
        <xsl:variable name="name" 
                      select="$a1driver/GeneralPartyInfo/NameInfo/PersonName" />
        <xsl:value-of select="concat($name/Surname, ' ', $name/GivenName)" />
    </Value>
    <Type>Tx</Type>
</Field>

$a1driver应该是对驱动程序PersDriver元素的引用,您可以使用它来获取有关所需驱动程序的任何其他信息。

为多个驱动程序执行此操作的更动态的方法(就像您在发布的答案中所做的那样)是使用for-eachtemplate s:

<xsl:for-each select="PersPolicy/AccidentViolation">
    <xsl:variable name="driver" select="key('kPers', @DriverRef)" />
    <Field>
        <Name><xsl:value-of select="concat('Accident', position(), '_Name')" /></Name>
        <Value>
            <xsl:variable name="name" 
                          select="$driver/GeneralPartyInfo/NameInfo/PersonName" />
            <xsl:value-of select="concat($name/Surname, ' ', $name/GivenName)" />
        </Value>
        <Type>Tx</Type>
    </Field>
</xsl:for-each>