XMLがあります。XSLT 1.0で変換する必要があります。 XMLフォルダ「フィールド」は、すべての「行」要素の名前順を定義します。したがって、すべての "行"フォルダ内のMaterialCodeは最初の位置にあり、StorageMatCodeは2番目に、 "金額"は3番目の位置にあります。すべての "MaterialCode"重複を削除する必要がありますが、すべての "Amounts"を1つにまとめてください。 入力のxml:xslt 1.0を使用してxmlから別個のノードと総量を選択してください
<Response xmlns="http://www.sample.ru/sample/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<ObjectType>StorageMats</ObjectType>
<Version>1.0.0</Version>
<Fields>
<Field type="decimal">MaterialCode</Field>
<Field type="decimal">StorageMatCode</Field>
<Field type="decimal">Amount</Field>
</Fields>
</Header>
<Body>
<Row>
<FieldValue>475625947</FieldValue>
<FieldValue>456789</FieldValue>
<FieldValue>1000</FieldValue>
</Row>
<Row>
<FieldValue>804685387</FieldValue>
<FieldValue>273456</FieldValue>
<FieldValue>3047</FieldValue>
</Row>
<Row>
<FieldValue>973681347</FieldValue>
<FieldValue>578357</FieldValue>
<FieldValue>2037</FieldValue>
</Row>
<Row>
<FieldValue>804685387</FieldValue>
<FieldValue>273456</FieldValue>
<FieldValue>5000</FieldValue>
</Row>
</Body>
</Response>
私はこのXMLを取得したい:
<?xml version="1.0" encoding="UTF-8"?>
<BDStorageMats xmlns="http://www.sample.ru/sample/BDStorageMats/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<BDStorageMat>
<MaterialCode>475625947</MaterialCode>
<Amount>1000</Amount>
</BDStorageMat>
<BDStorageMat>
<MaterialCode>804685387</MaterialCode>
<Amount>8047</Amount>
</BDStorageMat>
<BDStorageMat>
<MaterialCode>973681347</MaterialCode>
<Amount>2037</Amount>
</BDStorageMat>
</BDStorageMats>
私はこのXSLT作成しました:
<xsl:stylesheet version="1.0" xmlns="http://www.sample.ru/sample/BDStorageMats/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
<xsl:key match="*[local-name()= 'Response']/*[local-name()= 'Body']/*[local-name()= 'Row']" name="codeDistinct" use="*[local-name()= 'FieldValue'][count(*[local-name()= 'Response']/*[local-name()= 'Header']/*[local-name()= 'Fields']/*[local-name()= 'Field'][.='MaterialCode']/preceding-sibling::*)+1]"/>
<xsl:template match="/">
<BDStorageMats>
<xsl:variable name="amountPosition" select="count(*[local-name()= 'Response']/*[local-name()= 'Header']/*[local-name()= 'Fields']/*[local-name()= 'Field'][.='Amount']/preceding-sibling::*)+1"/>
<xsl:variable name="materialCodePosition" select="count(*[local-name()= 'Response']/*[local-name()= 'Header']/*[local-name()= 'Fields']/*[local-name()= 'Field'][.='MaterialCode']/preceding-sibling::*)+1"/>
<xsl:for-each select="*[local-name()= 'Response']/*[local-name()= 'Body']/*[local-name()= 'Row'][generate-id() = generate-id(key('codeDistinct', *[local-name()= 'FieldValue'][count(*[local-name()= 'Response']/*[local-name()= 'Header']/*[local-name()= 'Fields']/*[local-name()= 'Field'][.='MaterialCode']/preceding-sibling::*)+1]))[1]]">
<xsl:variable name="keyGroup" select="key('codeDistinct', *[local-name()= 'FieldValue'][count(*[local-name()= 'Response']/*[local-name()= 'Header']/*[local-name()= 'Fields']/*[local-name()= 'Field'][.='MaterialCode']/preceding-sibling::*)+1])"/>
<BDStorageMat>
<MaterialCode>
<xsl:value-of select="(*[local-name()= 'FieldValue'])[$materialCodePosition]"/>
</MaterialCode>
<Amount>
<xsl:value-of select="sum($keyGroup/(*[local-name()= 'FieldValue'])[$amountPosition])"/>
</Amount>
</BDStorageMat>
</xsl:for-each>
</BDStorageMats>
</xsl:template>
</xsl:stylesheet>
をそして、それはで正常に動作しますAltova、私のシステムはXSLTのためにApache Xalan Processorを使用します。 XSLTからこの行を拒否する:
私はXSLT 1.0経由で何をしたいのですか?