XSLT新手 - 循环和匹配元素

时间:2017-11-15 18:55:44

标签: xslt

XSLT全新,但设法破解了我需要的数据......

我现在停留在将数据提取为所需格式以上传到数据库中......我需要将每个PGBLK与其相应的TASK相匹配(请参阅下面的示例)。

我很确定我想使用XSLT循环,但说实话我不确定,非常感谢任何帮助!

这是源XML:

<?xml version="1.0" encoding="UTF-8"?>
 <PGBLK CHAPNBR="05" CHG="U" CONFNBR="0" PGBLKNBR="2" REVDATE="20160608" SECTNBR="00" SUBJNBR="00">
  <TASK CHAPNBR="05" CHG="R" FUNC="912" PGBLKNBR="2" REVDATE="20160520" SECTNBR="00" SEQ="001"
    SUBJNBR="00"/>
    <EFFECT EFFRG="000" EFFTEXT="ALL"/>
  <TASK CHAPNBR="05" CHG="R" FUNC="910" PGBLKNBR="2" REVDATE="20160520" SECTNBR="00" SEQ="801"
    SUBJNBR="00">
    <EFFECT EFFRG="000" EFFTEXT="ALL"/>
   </TASK>
</PGBLK>

当前的XSLT:

<xsl:template match="RTM">

 <REFERENCES>
    <xsl:attribute name="DATE">
        <xsl:value-of select="current-date()"/>
    </xsl:attribute>
        <xsl:for-each select="//PGBLK">
            <REF>
             <PGBLK>
              <xsl:value-of select="concat(@CHAPNBR, '-', @SECTNBR, '-', @SUBJNBR, '-', @PGBLKNBR, '-0')"/>
                </PGBLK>
            <TASK>
             <xsl:value-of select="TASK/concat(@CHAPNBR, '-', @SECTNBR, '-', @SUBJNBR, '-', @FUNC, '-', @SEQ, ',')"/>
            </TASK>
            </REF>
        </xsl:for-each>
    </REFERENCES>
</xsl:template>

当前XML输出:

<REFERENCES DATE="2017-11-15-06:00">
 <REF>
  <PGBLK>05-00-00-2-0</PGBLK>
  <TASK>05-00-00-912-001, 05-00-00-910-801,</TASK>
 </REF>
</REFERENCES>

所需的XML输出:

<REFERENCES DATE="2017-11-15-06:00">
 <REF>
  <PGBLK>05-00-00-2-0</PGBLK><TASK>05-00-00-912-001</TASK>
  <PGBLK>05-00-00-2-0</PGBLK><TASK>05-00-00-910-801</TASK>
 </REF>
</REFERENCES>

2 个答案:

答案 0 :(得分:1)

关于如何将<PGBLK>元素映射到其父<TASK>元素的主要问题,这非常简单:选择..进行转换,并在其模板内< / p>

  • 通过XPath表达式(例如<PGBLK>
  • 访问父级
  • 通过词汇周围范围内的变量或模板动态范围提供的模板参数提供父数据。

由于<TASK>可能没有<xsl:template match="RTM"> <!-- NOTE: no need for xsl-attribute unless the attribute name or namespace is dynamically determined --> <REFERENCES DATE="{current-date()}"> <xsl:for-each select=".//PGBLK"> <!-- capture the relevant details of the current PGBLK for re-use in nested contexts --> <xsl:variable name="blk-code" select="concat(@CHAPNBR, '-', @SECTNBR, '-', @SUBJNBR, '-', @PGBLKNBR, '-0')"/> <REF> <!-- transform all the PGBLK's TASKs, providing a PGBLK with each: --> <xsl:for-each select="TASK"> <PGBLK> <xsl:value-of select="$blk-code"/> </PGBLK> <TASK> <xsl:value-of select="concat(@CHAPNBR, '-', @SECTNBR, '-', @SUBJNBR, '-', @FUNC, '-', @SEQ)"/> </TASK> </xsl:for-each> <!-- handle the case of a PGBLK without any TASKs (in which case the for-each will not have added anything to the result tree: --> <xsl:if test="not(TASK)"> <PGBLK> <xsl:value-of select="$blk-code"/> </PGBLK> <TASK/> </xsl:if> </REF> </xsl:for-each> </REFERENCES> </xsl:template> 的可能性,这个过程有点复杂,但并不是那么难。这是一个贴近您原始模板的变体:

myFunction();
var val = 1.0;
function myFunction() {

val -= 0.02;
    $('.myDiv').css("opacity", val);
    setTimeout(myFunction, 20);
}

答案 1 :(得分:0)

如果您想将PGBLK映射到REF,然后将每个TASK映射到一对PGBLKTASK,那么以下内容应该有所帮助:

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

<xsl:output indent="yes"/>

<xsl:template match="RTM">
    <REFERENCES DATA="{current-date()}">
        <xsl:apply-templates/>
    </REFERENCES>
</xsl:template>

<xsl:template match="PGBLK">
    <REF>
        <xsl:apply-templates select="TASK"/>
    </REF>
</xsl:template>

<xsl:template match="TASK">
    <PGBLK>
        <xsl:value-of select="../((@CHAPNBR, @SECTNBR, @SUBJNBR, @PGBLKNBR)/string(), '0')" separator="-"/>
    </PGBLK>
    <xsl:copy>
        <xsl:value-of select="@CHAPNBR, @SECTNBR, @SUBJNBR, @FUNC, @SEQ" separator="-"/>
    </xsl:copy>
</xsl:template>

</xsl:transform>

http://xsltransform.net/ehVYZP2