如何在XSLT中执行不同的XSLT?

时间:2016-08-26 02:18:34

标签: xml xslt xsd xml-parsing

基本上我有3个独立的XSLT,目前可用于3种不同的XML。相反,我希望有一个XSLT可以根据传入中的特定来决定执行特定的XSLT并获得结果良好的XML。

我尝试使用以下方法 -

 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">    
                <xsl:choose>
                    <xsl:when test="fruits/apples">
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                      <xsl:template match="/">
                      <data>
                        <doc api_type="2" key="20" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:custom="urn:custom.com" ">
                            <custom:DataSet xyt1:type="tdc:somedataset">
                               <custom:some_table>
                                <custom:anothertable>
                                    <xyt1:key>
                                        <xyt1:fruitqty>
                             <xsl:value-of select="fruit/apple"/>
                                         </xyt1:fruitqty>
                                    </xyt1:key>
                                  <end of this xslt>
            </xsl:when>
            <xsl:when test="vegetables/tomatoes">
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                      <xsl:template match="/">
                      <data>
                        <doc api_type="3" key="100" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:custom="urn:custom.com" ">
                            <custom:DataSet xyt1:type="tdc:somedataset2">
                               <custom:some_table2>
                                <custom:anothertable2>
                                    <xyt1:fruitqty>
                             <xsl:value-of select="fruit/oranges"/>
                                         </xyt1:fruitqty>
                                  <end of this xslt2>
        </xsl:when>
        </xsl:choose>
        </xsl:template>
        </xsl:stylesheet>

我会得到两个不同的XML文件 -

档案1 -

 <fruits>
        <apple>2</apple>        
    </fruits>

档案2 -

<vegetables>
    <tomatoes>2</tomatoes>        
</vegetables>

所以我想在找到水果/苹果时执行第一个xslt,然后为蔬菜/西红柿执行另一个xslt。

准确地说,基于输入XML节点,我想执行一个特定的XSLT,我有个别的工作文件,但我希望它们都在一个单独的XSLT中。

这个方法进入正确的块但是没有输出任何“节点”,它只是输出XML中的值。

例如.- 它只显示苹果的“2”而不是像<xyt1:fruitqty> 2 </xyt1:fruitqty>.

这样的节点

结果我无法获得格式正确的XML。任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:0)

  

所以我想在找到水果/苹果时执行第一个xslt   为蔬菜/西红柿执行另一个。

我建议你使用单独的模板来匹配每种类型的输入,例如:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <output>
        <!-- instructions common to all types -->
        <xsl:apply-templates/>
    </output>
</xsl:template>

<xsl:template match="/fruits">
    <!-- instructions for transforming fruits -->
</xsl:template>

<xsl:template match="/vegetables">
    <!-- instructions for transforming vegetables -->
</xsl:template>

</xsl:stylesheet>