Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops XSLT1.0按顺序连接随机值_Loops_Xslt_Concatenation - Fatal编程技术网

Loops XSLT1.0按顺序连接随机值

Loops XSLT1.0按顺序连接随机值,loops,xslt,concatenation,Loops,Xslt,Concatenation,我是XSLT新手,我正在尝试解决这个问题。我必须从XML中获取一些值并连接它们。每当我试图这样做,我只得到一个值,但我希望在我的结果中的所有4个值。XML值可以是任意顺序,但我只希望结果是特定格式。结果应为Tag61值+Tag9F01值+Tag81值+Tag4F值(请忽略+符号) 请在下面找到XML <Transaction_details> <Transaction> <Detail> <tag>9F01</tag> <

我是XSLT新手,我正在尝试解决这个问题。我必须从XML中获取一些值并连接它们。每当我试图这样做,我只得到一个值,但我希望在我的结果中的所有4个值。XML值可以是任意顺序,但我只希望结果是特定格式。结果应为Tag61值+Tag9F01值+Tag81值+Tag4F值(请忽略+符号)

请在下面找到XML

<Transaction_details> 
<Transaction> 
<Detail> 
<tag>9F01</tag> 
<tag_value>9F01020001</tag_value>   
</Detail> 
<Detail> 
<tag>9F40</tag> 
<tag_value>9F40020001</tag_value>   
</Detail> 
<Detail> 
<tag>9F021</tag> 
<tag_value>9F021020001</tag_value>  
</Detail> 
<Detail> 
<tag>81</tag> 
<tag_value>81020001</tag_value> 
</Detail> 
<Detail> 
<tag>9F44</tag> 
<tag_value>9F44020001</tag_value>   
</Detail> 
<Detail> 
<tag>94</tag> 
<tag_value>94020001</tag_value> 
</Detail> 
<Detail> 
<tag>4F</tag> 
<tag_value>4F1020001</tag_value>    
</Detail> 
<Detail> 
<tag>61</tag> 
<tag_value>61020001</tag_value> 
</Detail> 
</Transaction>  
</Transaction_details> 

9F01
9F01020001
9F40
9F40020001
9F021
9F021020001
81
81020001
9F44
9F44020001
94
94020001
4F
4F1020001
61
61020001
我写的代码

<xsl:for-each select="Transaction_details/Transaction"> 
<xsl:variable name="TAG"> 
<xsl:value-of select="Detail/tag"/> 
</xsl:variable> 
<xsl:variable name="TotalTags"> 
<xsl:variable name="Tag61"> 
<xsl:choose> 
<xsl:when test="$TAG='61'"> 
<xsl:value-of select="Detail/tag_value"/> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="'No Data'"/> 
</xsl:otherwise>    
</xsl:choose> 
</xsl:variable> 
<xsl:variable name="Tag9F01"> 
<xsl:choose> 
<xsl:when test="$TAG='9F01'"> 
<xsl:value-of select="Detail/tag_value"/> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="'No Data'"/> 
</xsl:otherwise>    
</xsl:choose> 
</xsl:variable> 
<xsl:variable name="Tag81"> 
<xsl:choose> 
<xsl:when test="$TAG='81'"> 
<xsl:value-of select="Detail/tag_value"/> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="'No Data'"/> 
</xsl:otherwise>    
</xsl:choose> 
</xsl:variable> 
<xsl:variable name="Tag4F"> 
<xsl:choose> 
<xsl:when test="$TAG='4F'"> 
<xsl:value-of select="Detail/tag_value"/> 
</xsl:when> 
<xsl: otherwise> 
<xsl:value-of select="'No Data'"/> 
</xsl:otherwise>    
</xsl:choose> 
</xsl:variable> 
<xsl:value-of select="concat($Tag61,$Tag9F01,$Tag81,$Tag4F)"/>  
</xsl:variable> 
</xsl:for-each> 

在这段代码之后,当我连接这些值时,我只得到1个值。 我正在使用XSLT1.0。请问有谁能给我一些建议,如何达到预期的效果。哪一个好的选择递归模板或为每个_解决这个问题

提前谢谢大家,


Kaushik

为了突出XSLT的几个问题,一个问题是如何定义
标记
变量

<xsl:variable name="TAG"> 
    <xsl:value-of select="Detail/tag"/> 
</xsl:variable> 
然后将
TAG
设置为所有
Detail/TAG
记录的节点集

同样,当你做一个测试时,你也做了这个

<xsl:when test="$TAG='61'"> 
    <xsl:value-of select="Detail/tag_value"/> 
</xsl:when> 
注意,这里实际上不需要模板匹配
tag\u值
,因为内置模板只用于输出文本

仅当标签始终存在时,此操作才有效。虽然您在问题中没有提到它,但如果标签不存在,您似乎希望输出“无数据”

要做到这一点,并避免重复编码,可以使用命名模板。也试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text" indent="yes" />

    <xsl:template match="Transaction_details/Transaction">
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'61'" /></xsl:call-template>
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'9F01'" /></xsl:call-template>
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'81'" /></xsl:call-template>
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'4F'" /></xsl:call-template>
    </xsl:template>

    <xsl:template name="TagValue">
        <xsl:param name="tag" />
        <xsl:variable name="value" select="Detail[tag=$tag]/tag_value" />
        <xsl:value-of select="$value" />
        <xsl:if test="not($value)">No Data</xsl:if>
    </xsl:template>
</xsl:stylesheet>

没有数据
请忽略我写的代码。你能推荐我吗 一些代码,它将为我提供 标签61、9F01、81和4F

您的问题仍然不太清楚,但如果您想将所有
Detail
s的
tag\u值与列出的4个标记之一连接起来,您可以非常简单地通过以下方式:

XSLT1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" encoding="utf-8"/>

<xsl:template match="/Transaction_details">
    <xsl:for-each select="Transaction/Detail[tag='61' or tag='9F01' or tag='81' or tag='4F']" >
        <xsl:value-of select="tag_value"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

“我只有一个价值”不,你没有。你发布的代码没有任何价值。即使在纠正了语法错误之后,您所做的只是写入变量——实际上您并没有输出任何东西。也不清楚你想要得到什么样的实际结果。请编辑您的问题并添加您希望作为转换结果看到的确切代码。您好,请忽略我编写的代码。您能给我推荐一些代码,让我知道标签61、9F01、81和4F的串联标签值节点值吗?谢谢,请编辑您的问题并添加您希望作为转换结果看到的确切代码。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="text" indent="yes" />

    <xsl:template match="Transaction_details/Transaction">
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'61'" /></xsl:call-template>
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'9F01'" /></xsl:call-template>
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'81'" /></xsl:call-template>
        <xsl:call-template name="TagValue"><xsl:with-param name="tag" select="'4F'" /></xsl:call-template>
    </xsl:template>

    <xsl:template name="TagValue">
        <xsl:param name="tag" />
        <xsl:variable name="value" select="Detail[tag=$tag]/tag_value" />
        <xsl:value-of select="$value" />
        <xsl:if test="not($value)">No Data</xsl:if>
    </xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" encoding="utf-8"/>

<xsl:template match="/Transaction_details">
    <xsl:for-each select="Transaction/Detail[tag='61' or tag='9F01' or tag='81' or tag='4F']" >
        <xsl:value-of select="tag_value"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
9F01020001810200014F102000161020001