从XML的不同部分选择XSL中的数据

时间:2015-06-16 08:24:39

标签: xml xslt

我是XSLT的新手。

我有一个XML -

<root>
  <fiberList>
              <fiber>
                     <A>abcd</A>
                     <B>bcde</B>
                     <C>cdef</C>

              </fiber>
    </fiberList>
           <generatorList>
              <generator>
                     <D>defg</D>
                     <E>efgh</E>
              </generator>
 </root>

我想通过XSL将这个XML转换为另一个XML。 生成的XML应该是这样的 -

<parent>
          <child>
                  <M>abcd</M>
                  <N>bcde</N>
                  <O>efgh</O>
          </child>
</parent>

但是我在转换后得到以下XML -

<parent>
          <child>
                  <M>abcd</M>
                  <N>bcde</N>
                  <O/>
          </child>
</parent>

我的XSL如下 -

<xsl:template match="/">
<xsl:element name="parent">
      <xsl:apply-templates select="root/fiberList/fiber"/>
</xsl:element>
</xsl:template>
<xsl:template match="root/fiberList/fiber">
    <xsl:element name="child">
        <xsl:element name="M">
            <xsl:value-of select="A"/>
        </element>
        <xsl:element name="N">
            <xsl:value-of select="B"/>
        </element>
       <xsl:element name="O">
           <xsl:value-of select="root/generatorList/generator/E"/>
       </element>
   </element>
</template>
</stylesheet>

请帮忙。

2 个答案:

答案 0 :(得分:0)

我还没试过......但我想 一个领先的&#39; /&#39;在这里遗失:

 <xsl:value-of select="root/generatorList/generator/E"/>
请试试这个:

 <xsl:value-of select="/root/generatorList/generator/E"/>

否则xslt引擎正在尝试查找相对路径 &#34;根/ generatorList /发电机/ E &#34;从匹配的开始 模板的元素(/ root / fiberList / fiber)但没有 /根/ fiberList /纤维/根/ generatorList /发电机/ E

答案 1 :(得分:0)

作为替代方案,您也可以使用此样式表:

<强> XSLT-1.0

allowed_tags = ['img']
allowed_attrs = {'img':['src','alt']};
target.body_html = bleach.linkify(bleach.clean(markdown(value,output_format='html'),tags=allowed_tags,attributes=allowed_attrs,strip=True));

修改

XSLT-2.0 中,您可以将<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output indent="yes" method="xml"/> <xsl:strip-space elements="*"/> <xsl:template match="/root"> <parent> <child> <xsl:apply-templates select="fiberList/fiber/A | fiberList/fiber/B | generatorList/generator/E"/> </child> </parent> </xsl:template> <xsl:template match="A"> <M> <xsl:value-of select="."/> </M> </xsl:template> <xsl:template match="B"> <N> <xsl:value-of select="."/> </N> </xsl:template> <xsl:template match="E"> <O> <xsl:value-of select="."/> </O> </xsl:template> </xsl:stylesheet> 指令简化为以下内容:

xsl:apply-templates