【问题标题】:XSLT: moving upfrom two for-each loopsXSLT:从两个 for-each 循环向上移动
【发布时间】:2017-07-14 08:08:01
【问题描述】:

我知道 XSLT 的基础知识,但我有一个非常复杂的 XML 文档,我需要从中检索一些元素。 for 循环中有一个 for 循环,并在树节点中向上。 我已经完成了基本的事情,但无法理解更困难的事情。 我无法在此处发布我需要转换的 XML 文件,但这是我的问题的一个表示:

<Z xmlns="blablabla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <A>
    <B>
        <C>date</C>
        <D>
           <F>client 1 data</F> 
           <E>
              <X>transaction 1</X>
           </E>
           <E>
              <X>transaction 2</X>
           </E>
        </D>
        <D>
        <F>client 2 data</F>  
           <E>
              <X>transaction 1</X>
           </E>
        </D>
     </B>
  </A>
</Z>
  1. 所以标签中可能有很多标签(每个标签一个),标签中可能有很多标签(每个标签都有一个标签)。当我在标签内并从那里检索数据时,我需要使用两个循环之外的标签中的数据。我需要 D * E 部分,并且在每个部分中我都需要使用来自标签的相同数据,这些数据独立于来自和的数据。

  2. 1234563那么就使用&lt;xsl:value-of select="z:C" /&gt; ?

到目前为止,这是我的 XSL 文件,但不幸的是它不起作用:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:z="blablabla">
<xsl:output method="text" encoding="utf-8" />
    <xsl:template match="z:A/z:B">
          <xsl:value-of select="/z:C"/>
                  <xsl:for-each select="/z:D">
                         <xsl:for-each select="/z:E">
        should be repeated value from tag C in every section within those loops <xsl:value-of select="../../z:C"/>
                         </xsl:for-each>
                    </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出可能是:(只是为了向您展示我所说的部分)

date : client 1 data -> transaction 1, transaction 2
date : client 2 data -> transaction 1
...

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    这对你有用吗:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:z="blablabla">
    <xsl:output method="text" encoding="utf-8" />
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="z:B">
        <xsl:variable name="date" select="z:C" />
        <xsl:for-each select="z:D">
            <xsl:value-of select="$date"/>
            <xsl:text> : </xsl:text>
            <xsl:value-of select="z:F"/>
            <xsl:text> -> </xsl:text>
            <xsl:for-each select="z:E">
                <xsl:value-of select="z:X"/>
                <xsl:if test="position()!=last()">
                    <xsl:text>, </xsl:text>
                </xsl:if>
            </xsl:for-each> 
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
    
    </xsl:stylesheet>
    

    如果您使用的是 XSLT 2.0,则可以替换:

        <xsl:for-each select="z:E">
            <xsl:value-of select="z:X"/>
            <xsl:if test="position()!=last()">
                <xsl:text>, </xsl:text>
            </xsl:if>
        </xsl:for-each> 
    

    与:

        <xsl:value-of select="z:E/z:X" separator=", "/>
    

    【讨论】:

    • 你会这么好心并检查我的编辑 1 吗?我无法让我的真实示例与您的解决方案一起使用...
    • 这似乎是一个单独的问题。答案是内置的模板规则可以处理您没有匹配模板的节点。匹配根元素或添加模板抑制文本。
    • 但为什么它适用于您的示例?为什么
    • 因为ZA 元素没有子文本节点。
    • 我创建了新问题——如果你能提供帮助,我将不胜感激,因为我很难理解它——我不熟悉 XSLT。链接->stackoverflow.com/questions/45099278/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多