Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
XSLT将XML转换为管道分隔的Txt-将行转换为列_Xml_Xslt_Transpose - Fatal编程技术网

XSLT将XML转换为管道分隔的Txt-将行转换为列

XSLT将XML转换为管道分隔的Txt-将行转换为列,xml,xslt,transpose,Xml,Xslt,Transpose,我需要帮助使用XSLT将行元素转换为列,并生成管道分隔的文本文件。 请注意,每个wd:Report\u条目的wd:Pay\u输入元素的数量是可变的 XML: 添加的示例代码似乎符合我的要求。请让我知道,如果需要作出任何更正 <xsl:stylesheet version="1.0" xmlns:wd="urn:com.workday.report/ERP-PAY-CR-ELEMENT_ENTRY" xmlns:xsl="http://www.w3.org/1999/XSL/Tran

我需要帮助使用XSLT将行元素转换为列,并生成管道分隔的文本文件。 请注意,每个wd:Report\u条目的wd:Pay\u输入元素的数量是可变的

XML:

添加的示例代码似乎符合我的要求。请让我知道,如果需要作出任何更正

<xsl:stylesheet version="1.0" xmlns:wd="urn:com.workday.report/ERP-PAY-CR-ELEMENT_ENTRY"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <xsl:text>UNIQUE_IDENTIFIER</xsl:text>
        <xsl:value-of select="'|'"/>
        <xsl:text>ASSIGNMENT_NUMBER</xsl:text>
        <xsl:value-of select="'|'"/>
        <xsl:for-each select="(//node())[4 >= position()]">
            <xsl:variable name="i" select="position()"/>
            <xsl:value-of select="concat('ELEMENT_NAME',$i)"/>
            <xsl:value-of select="'|'"/>
            <xsl:value-of select="concat('INPUT_VALUE',$i)"/>
            <xsl:choose>
                <xsl:when test="position()!=last()">
                    <xsl:value-of select="'|'"/>
                </xsl:when>
                <xsl:when test="position()=last()">
                    <xsl:text>&#10;</xsl:text>
                </xsl:when>

            </xsl:choose>
        </xsl:for-each>
        <xsl:for-each select="wd:Report_Data/wd:Report_Entry">
            <xsl:value-of select="wd:UNIQUE_IDENTIFIER"/>
            <xsl:value-of select="'|'"/>
            <xsl:value-of select="wd:ASSIGNMENT_NUMBER"/>
            <xsl:value-of select="'|'"/>

            <xsl:for-each select="wd:Pay_Input">
                <xsl:value-of select="wd:ELEMENT_NAME"/>
                <xsl:value-of select="'|'"/>
                <xsl:value-of select="wd:INPUT_VALUE"/>
                <xsl:value-of select="'|'"/>
            </xsl:for-each>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
</xsl:template>
</xsl:stylesheet>


唯一标识符
分配号





如果您知道
wd:Pay\u Input
元素的最大数量是4个,那么您可以更简单地生成标题:

<xsl:text>UNIQUE_IDENTIFIER|ASSIGNMENT_NUMBER|ELEMENT_NAME1|INPUT_VALUE1|ELEMENT_NAME2|INPUT_VALUE2|ELEMENT_NAME3|INPUT_VALUE3|ELEMENT_NAME4|INPUT_VALUE4&#10;</xsl:text>   
UNIQUE_IDENTIFIER | ASSIGNMENT|u NUMBER | ELEMENT_NAME1 | INPUT_VALUE1 | ELEMENT_NAME2 | INPUT_VALUE2 | ELEMENT_NAME3 | INPUT_VALUE4 | INPUT_VALUE4
;

如果没有,您可以将其动态化:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="urn:com.workday.report/ERP-PAY-CR-ELEMENT_ENTRY">
<xsl:output method="text"/>

<xsl:template match="wd:Report_Data">
    <!-- header -->
    <xsl:text>UNIQUE_IDENTIFIER|ASSIGNMENT_NUMBER</xsl:text>
    <!-- find the entry with max number of elements -->
    <xsl:for-each select="wd:Report_Entry">
        <xsl:sort select="count(wd:Pay_Input)" data-type="number" order="descending"/>
        <xsl:if test="position()=1">
            <!-- generate header labels -->
            <xsl:for-each select="wd:Pay_Input">
                <xsl:text>|ELEMENT_NAME</xsl:text>  
                <xsl:value-of select="position()"/>
                <xsl:text>|INPUT_VALUE</xsl:text>   
                <xsl:value-of select="position()"/>
            </xsl:for-each>
        </xsl:if>
    </xsl:for-each>
    <xsl:text>&#10;</xsl:text>  
    <!-- data -->
    <xsl:for-each select="wd:Report_Entry">
        <xsl:value-of select="wd:UNIQUE_IDENTIFIER"/>
        <xsl:text>|</xsl:text>  
        <xsl:value-of select="wd:ASSIGNMENT_NUMBER"/>
        <xsl:for-each select="wd:Pay_Input">
            <xsl:text>|</xsl:text>  
            <xsl:value-of select="wd:ELEMENT_NAME"/>
            <xsl:text>|</xsl:text>  
            <xsl:value-of select="wd:INPUT_VALUE"/>
        </xsl:for-each> 
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each> 
</xsl:template>

</xsl:stylesheet>

唯一|u标识符|分配|编号
|元素名称
|输入值

  
|  
|  
|  



我需要帮助。。。你需要帮助解决什么问题?您尝试的XSLT在哪里?嘿,Parfait-我希望有人可以共享伪代码。不管怎样,我尝试了一些东西,看起来它工作正常。如果有更好的方法,请告诉我。(将xslt添加到帖子中)。还有另一个代码审查站点:
<xsl:text>UNIQUE_IDENTIFIER|ASSIGNMENT_NUMBER|ELEMENT_NAME1|INPUT_VALUE1|ELEMENT_NAME2|INPUT_VALUE2|ELEMENT_NAME3|INPUT_VALUE3|ELEMENT_NAME4|INPUT_VALUE4&#10;</xsl:text>   
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="urn:com.workday.report/ERP-PAY-CR-ELEMENT_ENTRY">
<xsl:output method="text"/>

<xsl:template match="wd:Report_Data">
    <!-- header -->
    <xsl:text>UNIQUE_IDENTIFIER|ASSIGNMENT_NUMBER</xsl:text>
    <!-- find the entry with max number of elements -->
    <xsl:for-each select="wd:Report_Entry">
        <xsl:sort select="count(wd:Pay_Input)" data-type="number" order="descending"/>
        <xsl:if test="position()=1">
            <!-- generate header labels -->
            <xsl:for-each select="wd:Pay_Input">
                <xsl:text>|ELEMENT_NAME</xsl:text>  
                <xsl:value-of select="position()"/>
                <xsl:text>|INPUT_VALUE</xsl:text>   
                <xsl:value-of select="position()"/>
            </xsl:for-each>
        </xsl:if>
    </xsl:for-each>
    <xsl:text>&#10;</xsl:text>  
    <!-- data -->
    <xsl:for-each select="wd:Report_Entry">
        <xsl:value-of select="wd:UNIQUE_IDENTIFIER"/>
        <xsl:text>|</xsl:text>  
        <xsl:value-of select="wd:ASSIGNMENT_NUMBER"/>
        <xsl:for-each select="wd:Pay_Input">
            <xsl:text>|</xsl:text>  
            <xsl:value-of select="wd:ELEMENT_NAME"/>
            <xsl:text>|</xsl:text>  
            <xsl:value-of select="wd:INPUT_VALUE"/>
        </xsl:for-each> 
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each> 
</xsl:template>

</xsl:stylesheet>