创建一个XSLT,将数组转换为唯一的顺序元素

时间:2015-10-16 20:09:40

标签: arrays xml xslt

我正在尝试创建一个将数组转换为唯一顺序元素的XSLT。我可能没有正确解释这个,所以我会告诉你:

当前XML

<?xml version="1.0" encoding="UTF-8"?>
<DocumentRequests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <PlanID>20151014_103605</PlanID>
            <LetterType>
                        <Fund>Yes</Fund>
                        <Adding>Yes</Adding>
                        <Bau>Yes</Bau>
            </LetterType>
            <PlanNumbers>
                        <PlanNumber>A01</PlanNumber>
                        <PlanNumber>A02</PlanNumber>
                        <PlanNumber>A03</PlanNumber>
                        <PlanNumber>A04</PlanNumber>
                        <PlanNumber>A05</PlanNumber>
                        <PlanNumber>A06</PlanNumber>
                        <PlanNumber>456</PlanNumber>
            </PlanNumbers>
</DocumentRequests>

当前的XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     <xsl:template match="*">
            <SourceFeedbackTransformed>            
                <PlanAdminID><xsl:value-of select="PlanAdminID" /></PlanAdminID>    
                <xsl:for-each select="LetterType">
                     <xsl:copy-of select="*" copy-namespaces="no"/>
                </xsl:for-each>
                <xsl:for-each select="PlanNumbers">
                      <xsl:copy-of select="*" copy-namespaces="no"/>
                </xsl:for-each>
            </SourceFeedbackTransformed>           
    </xsl:template>
</xsl:stylesheet>

当前输出

<?xml version="1.0" encoding="UTF-8"?>
<SourceFeedbackTransformed xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
            <PlanAdminID/>
            <Fund>Yes</Fund>
            <Adding>Yes</Adding>
            <Bau>Yes</Bau>
            <PlanNumber>A01</PlanNumber>
            <PlanNumber>A02</PlanNumber>
            <PlanNumber>A03</PlanNumber>
            <PlanNumber>A04</PlanNumber>
            <PlanNumber>A05</PlanNumber>
            <PlanNumber>A06</PlanNumber>
            <PlanNumber>456</PlanNumber>
</SourceFeedbackTransformed>**

所需输出

<?xml version="1.0" encoding="UTF-8"?>
<SourceFeedbackTransformed xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
            <PlanAdminID/>
            <Fund>Yes</Fund>
            <Adding>Yes</Adding>
            <Bau>Yes</Bau>
            <PlanNumber1>A01</PlanNumber1>
            <PlanNumber2>A02</PlanNumber2>
            <PlanNumber3>A03</PlanNumber3>
            <PlanNumber4>A04</PlanNumber4>
            <PlanNumber5>A05</PlanNumber5>
            <PlanNumber6>A06</PlanNumber6>
            <PlanNumber7>456</PlanNumber7>
</SourceFeedbackTransformed>

如您所见,具有7个值的数组已转换为7个不同的元素。

感谢您的帮助。

干杯,

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式轻松获得结果:

XSLT 2.0

<xsl:stylesheet version="2.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:template match="/DocumentRequests">
    <SourceFeedbackTransformed>            
        <PlanAdminID><xsl:value-of select="PlanID" /></PlanAdminID>    
        <xsl:copy-of select="LetterType/*" copy-namespaces="no"/>
        <xsl:for-each select="PlanNumbers/PlanNumber">
            <xsl:element name="PlanNumber{position()}">
                <xsl:value-of select="."/>
            </xsl:element>
        </xsl:for-each>
    </SourceFeedbackTransformed>           
</xsl:template>

</xsl:stylesheet>

注意
我改变了你的意见:

<xsl:value-of select="PlanAdminID" />

为:

<xsl:value-of select="PlanID" />

因为您的输入中没有PlanAdminID元素。如果您确实想要输出一个空的<PlanAdminID/>元素,如您所请求的输出中所示,那么您可以直接执行此操作,而无需获取不存在的节点的值。