Я борюсь с проблемой xslt, когда мне нужно скопировать все под определенный элемент, но мне также нужно изменить значение одного из атрибутов.
Вот мой XML:
<?xml version="1.0" encoding="UTF-8"?>
<message>
<datetime datum="20190318" time="154933"/>
<information environment="A" formula="AA" database_action="I"/>
<identification versionnumber="1" publication_type="MESSAGE_NAME"/>
<content>
<PickWave>
<Pick pickID="1" groupID="11802182" groupType="orderPick" eachQuantity="1" sourceLocation="P5F.021.01-004" destinationLocation="E1A">
<Container containerID="11802182">
<ContainerType>CRATE</ContainerType>
</Container>
<Product productID="593000" description="593000-DESCRIPTION" unitOfMeasure="Box" weightUnitOfMeasure="g" dimensionUnitOfMeasure="mm" length="230" width="115,5" height="95" weight="312,1">
<Identifiers>
<Identifier label="barcode">
<AllowedValues>8713776016527</AllowedValues>
</Identifier>
</Identifiers>
</Product>
<Data>
<containerType>CRATE</containerType>
</Data>
</Pick>
<Pick pickID="2" groupID="11802182" groupType="orderPick" eachQuantity="1" sourceLocation="P5F.022.01-001" destinationLocation="E1A">
<Container containerID="11802182">
<ContainerType>CRATE</ContainerType>
</Container>
<Product productID="600318" description="600318-DESCRIPTION" unitOfMeasure="Bag" weightUnitOfMeasure="g" dimensionUnitOfMeasure="mm" length="160" width="160" height="230" weight="26,5">
<Identifiers>
<Identifier label="barcode">
<AllowedValues>8711247936732</AllowedValues>
</Identifier>
</Identifiers>
</Product>
<Data>
<containerType>CRATE</containerType>
</Data>
</Pick>
</PickWave>
</content>
<error exitcode="" message=""/>
</message>
А вот мой XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy copy-namespaces="no">
<xsl:message>
<xsl:value-of select="name(.)"/>
</xsl:message>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- When attribute matches @weight, @lenght, @width or @height, replace comma (EU) with dots (US) as decimal seperator -->
<xsl:template match="*:Product/@weight | *:Product/@length | *:Product/@width | *:Product/@height">
<xsl:variable name="vAttr" select="name(.)"/>
<xsl:attribute name="{$vAttr}" select="translate(.,',','.')"/>
</xsl:template>
</xsl:stylesheet>
Я понимаю, что мой первый шаблон соответствует каждому элементу / атрибуту и, таким образом, создает элементы <message>
до <content>
, но как мне заставить его соответствовать каждому элементу и атрибуту из элемента PickWave и скопировать все эти элементы?
И это будет мой желаемый вывод:
<?xml version="1.0" encoding="UTF-8"?>
<PickWave>
<Pick pickID="1" groupID="11802182" groupType="orderPick" eachQuantity="1" sourceLocation="P5F.021.01-004" destinationLocation="E1A">
<Container containerID="11802182">
<ContainerType>CRATE</ContainerType>
</Container>
<Product productID="593000" description="593000-DESCRIPTION" unitOfMeasure="Box" weightUnitOfMeasure="g" dimensionUnitOfMeasure="mm" length="230" width="115.5" height="95" weight="312.1">
<Identifiers>
<Identifier label="barcode">
<AllowedValues>8713776016527</AllowedValues>
</Identifier>
</Identifiers>
</Product>
<Data>
<containerType>CRATE</containerType>
</Data>
</Pick>
<Pick pickID="2" groupID="11802182" groupType="orderPick" eachQuantity="1" sourceLocation="P5F.022.01-001" destinationLocation="E1A">
<Container containerID="11802182">
<ContainerType>CRATE</ContainerType>
</Container>
<Product productID="600318" description="600318-DESCRIPTION" unitOfMeasure="Bag" weightUnitOfMeasure="g" dimensionUnitOfMeasure="mm" length="160" width="160" height="230" weight="26.5">
<Identifiers>
<Identifier label="barcode">
<AllowedValues>8711247936732</AllowedValues>
</Identifier>
</Identifiers>
</Product>
<Data>
<containerType>CRATE</containerType>
</Data>
</Pick>
</PickWave>