如何使用XSLT从给定的xml中提取特定的xml部分

时间:2016-01-22 07:26:01

标签: xml xslt

我需要提取<C></C>,方法是将参数传递给xslt,如下所示

<C>
<D></D>
<D></D>
</C>

使用xslt从下面的XML中获取。

<A>
<B/>
<C>
<D></D>
<D></D>
</C>
<E><D></D></E>
</A>

如果我能够将元素的值设置为&#34; C&#34;,我如何能够执行上述操作。我现在的xslt模板如下所示。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <!-- Identity transform -->
   <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()" />
      </xsl:copy>
   </xsl:template>
   <xsl:param name="element" />
   <xsl:template match="/">
      <$element>
         <xsl:processing-instruction name="xml-multiple">
            <xsl:value-of select="local-name(//D)" />
         </xsl:processing-instruction>
         <xsl:copy-of select="/A/$element/D" />
      </$element>
   </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

无法输入元素名称作为参数,并直接在select的XPath中使用它。

但是你可以用这种方式重构样式表:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <!-- Identity transform -->
   <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()" />
      </xsl:copy>
   </xsl:template>
   <xsl:param name="element" select="'C'"/>
   <xsl:template match="/">
      <xsl:element name="{$element}">

         <xsl:processing-instruction name="xml-multiple">
            <xsl:value-of select="local-name(//D)" />
         </xsl:processing-instruction>

         <xsl:copy-of select="/A/*[name() = $element]/D" />
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

获得的结果:

<?xml version="1.0" encoding="UTF-8"?>
<C>
  <?xml-multiple D?>
  <D/><D/>
</C>

对应于所需的输出。