我是xml的新手,我想通过插入我添加到StyleCollection中的Position()数字来在两个集合之间添加链接。现在,我需要将其作为StyleLink插入PackingLineCollection中,其中StyleNumber等于StyleCollection中的StyleNumber。有人能指出我正确的方向吗? 这是输入:
<Order>
<UniqueReferenceNumber>Order1234</UniqueReferenceNumber>
<StyleCollection>
<Style>
<StyleNumber>1234</StyleNumber>
<StyleType>
<Code>abc</Code>
</StyleType>
<LocationNumber></LocationNumber>
</Style>
<Style>
<StyleNumber>567</StyleNumber>
<StyleType>
<Code>xyz</Code>
</StyleType>
<LocationNumber></LocationNumber>
</Style>
</StyleCollection>
<SubOrderCollection>
<SubOrder>
<UniqueReferenceNumber>SubOrder1</UniqueReferenceNumber>
<PackingLineCollection>
<PackingLine>
<StyleNumber>1234</StyleNumber>
</PackingLine>
</PackingLineCollection>
</SubOrder>
<SubOrder>
<UniqueReferenceNumber>SubOrder2</UniqueReferenceNumber>
<PackingLineCollection>
<PackingLine>
<StyleNumber>xyz</StyleNumber>
</PackingLine>
</PackingLineCollection>
</SubOrder>
</SubOrderCollection>
</Order>
这是xslt:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" mlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match ="/">
<Order>
<Reference>
<xsl:value-of select="Order/UniqueReferenceNumber"/>
</Reference>
<StyleCollection>
<xsl:for-each select="Order/StyleCollection/Style">
<Style>
<StyleNumber>
<xsl:value-of select="StyleNumber"/>
</StyleNumber>
<LocationNumber><xsl:value-of select="position()"/>
</LocationNumber>
<StyleType>
<Code>
<xsl:value-of select="StyleType/Code"/>
</Code>
</StyleType>
</Style>
</xsl:for-each>
</StyleCollection>
<SubOrderCollection>
<xsl:for-each select="Order/SubOrderCollection/SubOrder">
<SubOrder>
<Reference><xsl:value-of select="UniqueReferenceNumber"/>
</Reference>
<PackingLineCollection>
<xsl:for-each select="PackingLineCollection/PackingLine">
<PackingLine>
<StyleNumber>
<xsl:value-of select="StyleNumber" />
</StyleNumber>
<StyleLink><xsl:value-of
Select="Order/StyleCollection/Style/LocationNumber"/></StyleLink>
</PackingLine>
</xsl:for-each>
</PackingLineCollection>
</SubOrder>
</xsl:for-each>
</SubOrderCollection>
</Order>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
我已经使用密钥和xsl:number
来实现它,如下所示(在XSLT 3中,但是密钥和xsl:number也应该在XSLT 1或2中也可以工作,您需要替换旧的{{1} }和身份转换模板):
<xsl:mode on-no-match="shallow-copy"/>
https://xsltfiddle.liberty-development.net/nc4NzQt/1但是找不到与第二个<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="style-ref" match="StyleCollection/Style" use="StyleNumber"/>
<xsl:template match="Style/LocationNumber">
<xsl:copy>
<xsl:number from="StyleCollection" level="any"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PackingLine/StyleNumber">
<xsl:next-match/>
<xsl:apply-templates select="key('style-ref', .)" mode="count"/>
</xsl:template>
<xsl:template match="Style" mode="count">
<StyleLink>
<xsl:number level="any" from="StyleCollection"/>
</StyleLink>
</xsl:template>
</xsl:stylesheet>
相匹配的Style
,不确定您的示例数据是否在那里没有参考,或者我是否误解了您的要求。
XSLT 1是
PackingLine/StyleNumber