如果source-Element在parameterfile中,则生成XSLT属性

时间:2010-04-29 12:02:30

标签: xslt

我有一个包含一些元素的xml文件。对于其中一些是参数xml文件中的aqvivalent以及一些其他元素。 如果元素名称匹配,我想将parm-file中的其他元素作为参数添加到输出文件中。 (只有在source-xml中存在元素“InvoiceHeader”时才应生成属性。

这是我的代码......

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">  
    <xsl:variable name="rpl" select="document('ParamInvoice.xml')"></xsl:variable>
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
       <xsl:template match="/">
             <xsl:apply-templates></xsl:apply-templates>
       </xsl:template>
       <xsl:template match="*">
          <xsl:copy>
          <xsl:if test="$rpl/StoraInvoice/local-name()">
            <xsl:call-template name="AttributeErzeugen">
               <xsl:with-param name="attr" select="$rpl/StoraInvoice/local-name()"></xsl:with-param>
      </xsl:call-template>
     </xsl:if>
    <xsl:apply-templates></xsl:apply-templates>
 </xsl:copy>
</xsl:template>
     <xsl:template name="AttributeErzeugen">
        <xsl:param name="attr"></xsl:param>
            <xsl:for-each select="$attr">
              <xsl:attribute name="{Attibute/@name}"><xsl:value-of select="."></xsl:value-  of></xsl:attribute>  
         </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>

这里是param-file

<?xml version="1.0" encoding="UTF-8"?>
<StoraInvoice>
   <InvoiceHeader>
      <Attribute name="Fuehrend">YYY</Attribute>
      <Attribute name="Feld">FFFF</Attribute>
      <Attribute name="Format">XYZXYZ</Attribute>
   </InvoiceHeader>
</StoraInvoice>

齐格弗里德

1 个答案:

答案 0 :(得分:1)

此转化

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

 <my:rpl>
  <StoraInvoice>
   <t>
     <InvoiceHeader>
      <Attribute name="Fuehrend">YYY</Attribute>
      <Attribute name="Feld">FFFF</Attribute>
      <Attribute name="Format">XYZXYZ</Attribute>
     </InvoiceHeader>
   </t>
  </StoraInvoice>
 </my:rpl>


 <xsl:variable name="rpl" select="document('')/*/my:rpl"/>

 <xsl:template match="*">
   <xsl:variable name="vInvoiceElement" select=
       "$rpl/StoraInvoice/*[name()=name(current())]"/>

   <xsl:copy>
     <xsl:if test="$vInvoiceElement">
        <xsl:call-template name="AttributeErzeugen">
          <xsl:with-param name="pInvoiced" select="$vInvoiceElement"/>
        </xsl:call-template>
     </xsl:if>
     <xsl:apply-templates/>
   </xsl:copy>
 </xsl:template>

 <xsl:template name="AttributeErzeugen">
  <xsl:param name="pInvoiced"/>
  <xsl:for-each select="$pInvoiced/InvoiceHeader/Attribute">
    <xsl:attribute name="{@name}">
     <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时:

<t/>

生成想要的正确结果

<t Fuehrend="YYY" Feld="FFFF" Format="XYZXYZ"/>