【问题标题】:for-each loop not fetching all elements in xsltfor-each 循环未获取 xslt 中的所有元素
【发布时间】:2021-10-27 07:48:23
【问题描述】:

我已经在模板中编写了映射元素列表,并且我正在将每个循环与调用模板一起使用。但我没有得到所有元素。下面是一个例子:

    <stores>
  <store>
    <books>
      <book>
        <section>1</section>
        <bookinfo>
          <bookdetails>
            <A>Author</A>
            <B>Dreams</B>
          </bookdetails>
        </bookinfo>
      </book>
     </books>
     <books>
      <book>
        <section>2</section>
        <bookinfo>
          <bookdetails>
            <A>Author</A>
            <B>Dreams</B>
        </bookdetails>
       </bookinfo>
      </book>
    </books>
  </store>
</stores>

在我的 xslt 中,我是这样写的:

<xsl:template match="/">
 <StoreDetails>           
   <xsl:for-each select="//stores/store/books/book">     
       <xsl:call-template name="name">
            <xsl:with-param name="param" select="."/> 
            </xsl:call-template>
        </xsl:for-each>
            
     </StoreDetails>    

但这不起作用。如果我像&lt;xsl:for-each select="//store/books/bookinfo"&gt; 一样给出,那么它可以工作,但输出中缺少元素&lt;section&gt;1&lt;/section&gt;。我想要element&lt;book&gt;下的所有元素。

这是我的预期输出:

<LocalStore>
     <LocalDetails>
     <section>1</section>
      <BookType>Author</BookType>
       <BookLPP>Dreams</BookLPP>
     </LocalDetails>
     <LocalDetails>
     <section>2</section>
      <BookType>Author1</BookType>
       <BookLPP>Dreams1</BookLPP>
     </LocalDetails>
      </LocalStore>

我应该根据我现有的要求使用模板和变量。这是示例的明确链接: https://xsltfiddle.liberty-development.net/3MP42NC/2

【问题讨论】:

  • 预期输出在哪里?从 xsl 片段中不清楚模板“名称”的用途是什么?
  • 我正在映射 下的每个元素
  • 显示你调用的那个模板的代码,加上你想要的输出和你得到的输出。
  • 我现在分享了这个链接,马丁。请检查。
  • 使用您发布的部分代码无法重现您报告的问题。请在minimal reproducible exampleminimal reproducible example在您的问题中发布所有必要的代码。

标签: xml xslt xslt-1.0


【解决方案1】:

看起来您的 XML 格式不正确。当父元素有子元素时,子元素的结束标签需要在父元素的结束元素之前。这样整个子元素都在父元素内。请参阅下面的示例。

<stores>
  <store>
    <books>
      <book>
        <section>1</section>
        <bookinfo>
          <bookdetails>
            <A>Author</A>
            <B>Dreams</B>
          </bookdetails>
        </bookinfo>
      </book>
     </books>
     <books>
      <book>
        <section>2</section>
        <bookinfo>
          <bookdetails>
            <A>Author</A>
            <B>Dreams</B>
        </bookdetails>
       </bookinfo>
      </book>
    </books>
  </store>
</stores>

【讨论】:

  • 很抱歉在这里提供了不正确的样品请求。但是我的问题还没有解决。
  • 没问题。我建议修复您的样品,使其成型良好。这将帮助其他人帮助你。干杯!
  • 另外,您的
【解决方案2】:

问题(至少是主要问题)在于您从问题中省略的代码。

当您调用命名模板时,上下文不会改变。在这种情况下,上下文是由您的指令建立的:

<xsl:for-each select="//stores/store/books/book"> 

从这个上下文中,指令:

<xsl:variable name="A" select="books//bookinfo/bookdetails/A"/>

不选择任何内容,因为books 不是book 的子代。它应该是这样的:

<xsl:variable name="A" select=".//bookinfo/bookdetails/A"/>

其他变量也是如此。


查看更正后的演示:https://xsltfiddle.liberty-development.net/3MP42NC/4

【讨论】:

  • 但是
    1
    ..这个标签没有迭代。我已经提到这是我的问题中的问题。
  • 要从book 的上下文中获取section,您可以简单地使用&lt;xsl:value-of select="section"/&gt;。如果您在bookdetails 的上下文中,请使用&lt;xsl:value-of select="../../section"/&gt;。 --附言我现在才注意到您在此处发布的输入与演示中的输入不同。所以现在我们同时讨论三种不同的场景。这不是应该的样子。
  • 对不起。我是这个网站的新手。第 1 节和第 2 节下有多个 bookinfo 详细信息。我需要在
    1
    标签 details1details2 下获取输出。但是我得到了第 1 节的详细信息 1,再次第 1 节的详细信息 2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多