当xsl文件中的模板与包含的xsl文件中的模板重叠时,包含的xsl将不会添加所需的内容

时间:2014-10-22 12:27:05

标签: .net xslt xslt-1.0

我生成各种XML文件,并将它们用作我的程序的测试用例。 我使用XSLT从基本的测试用例生成更复杂的测试用例,以避免重复XML内容。 xsl文件包含其他xsl文件,用于将一些XML内容添加到现有测试用例中。

我遇到了一个问题:当xsl文件中的模板与包含的xsl文件中的模板重叠时,所包含的模板不会添加所需的内容。

Hello.xml

<EBC>
  <Positionen>
    <Position>
      <ArtikelNr>HelloWorldProductRef</ArtikelNr> 
      <HerstNr>Hello world! (ProductName)</HerstNr>
    </Position>
  </Positionen>
</EBC>

Hello.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="/">
    <xsl:apply-templates select="document('Hello.xml')/*" />
  </xsl:template>
</xsl:stylesheet>

1_product_in_1_cat.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="Hello.xsl" />
  <xsl:template match="Position/*[last()]" xml:space="preserve">
    <xsl:copy-of select="." />
    <WWSWGNr>167000</WWSWGNr><WWSWGName_de>Mobotix IP Kameras</WWSWGName_de>
  </xsl:template>
</xsl:stylesheet>

1prod_2img_1cat.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="1_product_in_1_cat.xsl" />
  <xsl:template match="Position/*[last()]" xml:space="preserve">
    <xsl:copy-of select="." />
    <Bilder>
      <Bild>12011085_grob_102.jpg</Bild>
      <Bild>12011085_090.jpg</Bild>
    </Bilder>
  </xsl:template>
</xsl:stylesheet>

Hello.xsl的输出和1_product_in_1_cat.xsl的输出是正确的,我不想更改它。 1prod_2img_1cat.xsl的输出不是我想要的。

实际输出是

<EBC>
  <Positionen>
    <Position>
      <ArtikelNr>HelloWorldProductRef</ArtikelNr>
      <HerstNr>Hello world! (ProductName)</HerstNr>
      <Bilder>
        <Bild>12011085_grob_102.jpg</Bild>
        <Bild>12011085_090.jpg</Bild>
      </Bilder>
    </Position>
  </Positionen>
</EBC>

预期输出

<EBC>
  <Positionen>
    <Position>
      <ArtikelNr>HelloWorldProductRef</ArtikelNr>
      <HerstNr>Hello world! (ProductName)</HerstNr>
      <WWSWGNr>167000</WWSWGNr><WWSWGName_de>Mobotix IP Kameras</WWSWGName_de>
      <Bilder>
        <Bild>12011085_grob_102.jpg</Bild>
        <Bild>12011085_090.jpg</Bild>
      </Bilder>
    </Position>
  </Positionen>
</EBC>

我不希望1prod_2img_1cat.xsl了解Hello.xml和其他文件的标记名称和结构。是否有可能达到预期的效果?

请注意,Hello.xsl1_product_in_1_cat.xsl的输出必须保持不变,因为它们会在别处使用。

顺便说一句,我在xml个文件的输入上传递了一个空虚xsl文件,因此实际输入由document()函数定义。

1 个答案:

答案 0 :(得分:2)

我认为您要使用xsl:import代替xsl:include,然后替换

  <xsl:template match="Position/*[last()]" xml:space="preserve">
    <xsl:copy-of select="." />
    <Bilder>
      <Bild>12011085_grob_102.jpg</Bild>
      <Bild>12011085_090.jpg</Bild>
    </Bilder>
  </xsl:template>

  <xsl:template match="Position/*[last()]" xml:space="preserve">
    <xsl:apply-imports/>
    <Bilder>
      <Bild>12011085_grob_102.jpg</Bild>
      <Bild>12011085_090.jpg</Bild>
    </Bilder>
  </xsl:template>