通过对字段进行分组来转换XML

时间:2018-06-21 15:20:53

标签: xslt

我对XSLT的了解有限,但始终渴望学习。我目前正在研究一个需要转换XML输入的模板。我一直在尝试对InvoiceNum字段进行分组,但没有得到任何结果。 我收到错误消息:Envision.Utilities.XsltEngine-Object引用未设置为对象的实例。

以下是输入XML供参考:

<?xml version='1.0' ?>
  <Request>
  <Information>
    <ImageID>987456321</ImageID>
    <Contract>123456789</Contract>
    <Lastname>MICKEYMOUSE</Lastname>
  </Information>
<Document>
    <InvoiceNum>123456823</InvoiceNum>
    <Reference>AD20985224</Reference>
    <InvoiceNum>100000123</InvoiceNum>
    <Reference>AS20101387</Reference>
    <InvoiceNum>858511825</InvoiceNum>
    <Reference>GF96844</Reference>
    <InvoiceNum>885154145</InvoiceNum>
    <Reference>FGFD2018</Reference>
    <InvoiceNum>25241111</InvoiceNum>
    <Reference>SD88888</Reference>
    <InvoiceNum>8571414</InvoiceNum>
    <Reference>DF864841254</Reference>
    </Document>
 </Request>

这是我的XSLT格式供参考: 我想念什么?有没有更好的方法来格式化我目前在下面的XSLT模板?任何帮助将不胜感激。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="cols" select="3" />

<xsl:template match="Request">
 <table border="1">
 <xsl:apply-templates select="InvoiceNum[position() mod $cols = 1]"/>
 </table>
 </xsl:template>

<xsl:template match="Document">
<xsl:variable name="group" select=". | following-sibling::InvoiceNum
[position() &lt; $cols]" />
<xsl:for-each select="*">
<xsl:variable name="i" select="position()" />
<Invoice>
<InvoiceNumber>
<xsl:value-of select="InvoiceNum()"/>
</InvoiceNumber>
 <xsl:for-each select="$group">
 <xsl:value-of select="*[$i]"/>
 </xsl:for-each>
 </Invoice>
 </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

这是我想要的XML输出:

<InvCase>
  <Invoices>
    <InvoicemNumber>InvoiceNum1</InvoicemNumber>
    <InvoicemNumber>InvoiceNum2</InvoicemNumber>
    <InvoicemNumber>InvoiceNum3</InvoicemNumber>
 </Invoices>
</InvCase>

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试将InvoiceNum分为3组。您遇到的第一个问题是,在与Request匹配的模板中,您需要这样做...

<xsl:apply-templates select="InvoiceNum[position() mod $cols = 1]"/>

但是InvoiceNum不是Request的子代,因此什么也没选择。您可能需要这样做...

此外,您有一个匹配Document的模板,但这可能需要匹配InvoiceNum(如果您将following-sibling::InvoiceNum匹配为{,则进行Document不会返回任何内容{1}}元素是InvoiceNum的子元素,不紧随同级。

尝试使用此XSLT

Document