XSLT在一个文件中进行两次转换

时间:2013-09-11 14:40:46

标签: xml xslt transformation

我有一个XSLT转换,它将节点NADR_KOD的名称更改为NADR_KOD2,并复制剩余的XML而不做任何更改。 今天我想添加另一个将属性更改为元素的转换(我在堆栈上找到了解决方案)但是这两个转换在一个xslt中不起作用...

出现问题因为我没有在SSIS中加载'date'属性。 XML Source始终将date返回为null。也许你可以帮我解决这个问题?

XML的结构:

<DATA>
<ACCIDENT date="...">


 <INFO>
 <TEMP>
  <NADR_KOD>
   <NADR_KOD>Code</NADR_KOD>
  </NADR_KOD>
 </TEMP>
 </INFO>

</ACCIDENT>
</DATA>

这是我想要的:

<DATA>
<ACCIDENT>
 <date>...</date>

 <INFO>
 <TEMP>
  <NADR_KOD>
   <NADR_KOD2>Code</NADR_KOD2>
  </NADR_KOD>
 </TEMP>
 </INFO>

</ACCIDENT>
</DATA>

我有几个像这样的类似转换。我是这样做的:

  <xsl:template match="ACCIDENT">
  <!-- output a filter element -->
  <xsl:element name="ACCIDENT">
    <!-- add the name attribute, using the source name attribute value -->


   <xsl:element name="date">
     <xsl:value-of select="@date"/>
   </xsl:element>

   <!-- add the rest of attributes without change -->
   <xsl:copy-of select="node()"/>
 </xsl:element>


 </xsl:template>

 <xsl:template match="NADR_KOD/NADR_KOD">
    <NADR_KOD2>
        <xsl:apply-templates select="@*|node()"/>
    </NADR_KOD2>
 </xsl:template>

此代码不会将NADR_KOD更改为NADR_KOD2。 提前谢谢......

1 个答案:

答案 0 :(得分:0)

我认为不是

<!-- add the rest of attributes without change -->
   <xsl:copy-of select="node()"/>

你只想要

<!-- run the child elements through the identity transformation template for copying
     or my templates for transforming -->
<xsl:apply-templates/>

然后你可以使用

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

当然还有你的

 <xsl:template match="NADR_KOD/NADR_KOD">
    <NADR_KOD2>
        <xsl:apply-templates select="@*|node()"/>
    </NADR_KOD2>
 </xsl:template>

如果您想要转换更多元素,则可以为它们添加模板。