XSLT копирует все под определенный элемент, но изменяет значение некоторых атрибутов - PullRequest
1 голос
/ 20 марта 2019

Я борюсь с проблемой 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>

Ответы [ 2 ]

1 голос
/ 20 марта 2019

но как мне заставить его соответствовать каждому элементу и атрибуту из PickWave

Если я вас правильно понял, вы хотите изменить эти атрибуты в any элемент-потомок PickWave элемента.Итак, вам нужно:

<xsl:template match="*:PickWave//@weight
                    |*:PickWave//@lenght
                    |*:PickWave//@width
                    |*:PickWave//@height">
    <xsl:attribute name="{name()}" select="translate(.,',','.')"/>
</xsl:template> 

Или, если вы хотите, чтобы шаблон был больше в стиле XSLT 2.0

<xsl:template match="*:PickWave//@*[
                        some $a in ../(@weight|@lenght|@width|@height) 
                        satisfies $a is .
                     ]">
    <xsl:attribute name="{name()}" select="translate(.,',','.')"/>
</xsl:template> 
1 голос
/ 20 марта 2019

Если вы хотите, чтобы в выводе были только элементы PickWave, одним из решений будет просто иметь шаблон, соответствующий узлу документа, а затем выбрать только те элементы, которые вы хотите скопировать ....

Попробуйтедобавив этот шаблон в существующий XSLT

<xsl:template match="/">
    <xsl:apply-templates select="message/content/PickWave" />
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...