2010-09-21 59 views
0

我真是关闭此时间;)XSL不必要的下一个元素 - 读取标签和子标签属性

娄有:

  1. 我XSL脚本
  2. 我的XML文件(即通话脚本)

  3. 在xsl的操作的对XML的输出(如shuold是)

我的问题是,尽管href和src值应该是相同的,但它们之间始终存在一个 图片差异(pic3和pic4),就好像我在调用下一个pic元素一样......但我不明白我在哪里去做?

<xsl:for-each select="data/pics/pic"> 
     <div>     
      <a> 
       <xsl:attribute name="href"> 
        <xsl:value-of select="@href" /> 
       </xsl:attribute> 
       <img> 
        <xsl:attribute name="src"> 
         <xsl:value-of select="@src" /> 
        </xsl:attribute> 

       </img> 
      </a> 
     </div> 
    </xsl:for-each> 

这是我的XML

<data> 
    <pics> 
     <pic href="pics\pic05.jpg" src="pics\pic05.jpg"></pic> 
     <pic href="pics\pic04.jpg" src="pics\pic04.jpg"></pic> 
     <pic href="pics\pic03.jpg" src="pics\pic03.jpg"></pic> 
     <pic href="pics\pic02.jpg" src="pics\pic02.jpg"></pic> 
     <pic href="pics\pic01.jpg" src="pics\pic01.jpg"></pic> 
    </pics> 
</data> 

这应该是输出:

<div> 
    <a href="pics\pic01.jpg"> 
     <img src="pics\pic01.jpg"> 
    </a> 
</div> 
<div> 
    <a href="pics\pic02.jpg"> 
     <img src="pics\pic02.jpg"> 
    </a> 
</div> 
<div> 
    <a href="pics\pic03.jpg"> 
     <img src="pics\pic03.jpg"> 
    </a> 
</div> 
<div> 
    <a href="pics\pic04.jpg"> 
     <img src="pics\pic04.jpg"> 
    </a> 
</div> 
<div> 
    <a href="pics\pic05.jpg"> 
     <img src="pics\pic05.jpg"> 
    </a> 
</div> 
+2

为我工作。我已将您的for-each包含在中。使用xsltproc(--version使用libxml 20706,libxslt 10126和libexslt 815)它会以相反的顺序(从pic5到pic1,与源xml的顺序相同)生成预期结果。尝试创建一个最小但完整的(有效!)xsl模板来显示您的问题。 – rincewind 2010-09-21 15:28:06

+0

同上rincewind说。同时发布您从XSL样式表中获得的实际XML输出。 – LarsH 2010-09-21 16:22:59

+0

看到我的答案,报告提供的转换实际上产生了想要的结果。 – 2010-09-21 16:37:54

回答

2

您正在使用可能有错误,或者你没有提供的XSLT处理器真正的xslt代码和xml文档。

包括在一个完整的样式表时所提供的XSLT代码片断:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:template match="/"> 
    <html> 
    <xsl:for-each select="data/pics/pic"> 
      <div> 
       <a> 
        <xsl:attribute name="href"> 
         <xsl:value-of select="@href" /> 
        </xsl:attribute> 
        <img> 
         <xsl:attribute name="src"> 
          <xsl:value-of select="@src" /> 
         </xsl:attribute> 
        </img> 
       </a> 
      </div> 
     </xsl:for-each> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

和施加在提供的XML文档

<data> 
    <pics> 
     <pic href="pics\pic05.jpg" src="pics\pic05.jpg"></pic> 
     <pic href="pics\pic04.jpg" src="pics\pic04.jpg"></pic> 
     <pic href="pics\pic03.jpg" src="pics\pic03.jpg"></pic> 
     <pic href="pics\pic02.jpg" src="pics\pic02.jpg"></pic> 
     <pic href="pics\pic01.jpg" src="pics\pic01.jpg"></pic> 
    </pics> 
</data> 

产生想要的,正确的结果

<html> 
    <div> 
     <a href="pics\pic05.jpg"> 
      <img src="pics\pic05.jpg"/> 
     </a> 
    </div> 
    <div> 
     <a href="pics\pic04.jpg"> 
      <img src="pics\pic04.jpg"/> 
     </a> 
    </div> 
    <div> 
     <a href="pics\pic03.jpg"> 
      <img src="pics\pic03.jpg"/> 
     </a> 
    </div> 
    <div> 
     <a href="pics\pic02.jpg"> 
      <img src="pics\pic02.jpg"/> 
     </a> 
    </div> 
    <div> 
     <a href="pics\pic01.jpg"> 
      <img src="pics\pic01.jpg"/> 
     </a> 
    </div> 
</html> 

当使用几个不同的XSLT处理器(如MSXML3,4,6,Saxon6.5和AltovaXML(XML-SPY))执行此转换时,会产生相同的结果。

请注意,该变换可以重构为一个更短,可读之一:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:template match="/"> 
    <html> 
    <xsl:for-each select="data/pics/pic"> 
      <div> 
       <a href="{@href}"> 
        <img src="{@src}"/> 
       </a> 
      </div> 
     </xsl:for-each> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

+1这可能是一个缓存问题,但我喜欢你的代码 – Asaf 2010-09-21 17:35:10

+0

对于属性值模板建议。 – 2010-09-21 17:45:09