XSLT将XML转换为管道分隔的Txt-将行转换为列
我需要帮助使用XSLT将行元素转换为列,并生成管道分隔的文本文件。 请注意,每个wd:Report\u条目的wd:Pay\u输入元素的数量是可变的 XML: 添加的示例代码似乎符合我的要求。请让我知道,如果需要作出任何更正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
<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> </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> </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 </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> </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> </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 </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> </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> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>