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>
答案 0 :(得分:1)
关于如何将<PGBLK>
元素映射到其父<TASK>
元素的主要问题,这非常简单:选择..
进行转换,并在其模板内< / p>
<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
映射到一对PGBLK
和TASK
,那么以下内容应该有所帮助:
<?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>