如何将一个xslt文件导入另一个xslt

时间:2014-08-19 14:26:35

标签: xml xslt xslt-1.0

我正在使用xslt 1.0,我想将一个xslt文件导入另一个xslt文件。

下面是

示例:

A.XML

   <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       version="1.0">
          <xsl:template match="/">


             <header>
                <UserId>
                   <xsl:value-of select="'user1'" />
               </UserId>
               <UserPaassword>
                  <xsl:value-of select="'1234'" />
              </UserPaassword>
             </header>

    </xsl:template>
</xsl:stylesheet>

B.XML

   <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       version="1.0">
         <xsl:template match="/">
             <userData>
                <xsl:import href="A.xsl"/>
                  <body>
                     <UserAddress>
                        <xsl:value-of select="'India'" />
                     </UserAddress>
                     <UserPhoneNumber>
                        <xsl:value-of select="'123456789'" />
                     </UserPhoneNumber>
                  </body>
              </userData>
         </xsl:template>
     </xsl:stylesheet>

并且最终输出xsl应该如下所示

output.xsl

<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   version="1.0">
 <xsl:template match="/">
    <userData>
        <header>
            <UserId>
                <xsl:value-of select="'user1'" />
            </UserId>
            <UserPaassword>
                <xsl:value-of select="'1234'" />
            </UserPaassword>
        </header>
        <body>
            <UserAddress>
                <xsl:value-of select="'India'" />
            </UserAddress>
            <UserPhoneNumber>
                <xsl:value-of select="'123456789'" />
            </UserPhoneNumber>
        </body>
      </userData>
  </xsl:template>

I tried with the import statement but xsl:import is not allowed into xsl:template.

请帮助我。

提前非常感谢你。

1 个答案:

答案 0 :(得分:0)

您已经回答了自己的问题。 xsl:import内不允许xsl:template,因此您当前正在尝试的内容无效。当你使用xsl:import时,XSLT处理器将它替换为href属性中命名的样式表的内容,所以在你的情况下,你最终会得到像这样的XSLT ......

    <xsl:template match="/">
         <userData>
              <xsl:template match="/">
                  <header>

值得指出的是,XSLT处理器实际上不会在此处更改物理文件b.xml,也不会创建新的物理文件output.xsl。此导入仅在处理运行时应用。新的XSLT只存在于内存中。

你还没有确切地说出你想要实现的目标。但听起来你需要在这里阅读xsl:apply-imports。导入的模板的优先级低于主模板中的模板,因此您可以使用xsl:apply-imports在导入的模板中应用此类模板。

作为初学者,请将您的B.xml文件更改为

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:import href="A.xml"/>
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <userData>
      <xsl:apply-imports />
      <body>
        <UserAddress>
          <xsl:value-of select="'India'" />
        </UserAddress>
        <UserPhoneNumber>
          <xsl:value-of select="'123456789'" />
        </UserPhoneNumber>
      </body>
    </userData>
  </xsl:template>
</xsl:stylesheet>

因此,当示例中使用xsl:apply-imports时,它实际上会匹配导入的a.xml文件中的主模板。

有关详细信息,请参阅http://www.w3.org/TR/xslt#section-Combining-Stylesheets