1

そのような変換を取得することは可能ですか:

ソース XML:

<Item>
  <stockcode>XXX1</stockcode>
  <vehicle>Bentley</vehicle>
  <model>Continental GT (2006-)</model>
  <model>Continental Flying Spur (2006-)</model>
  <width>9</width>
  <wheel_size>20</wheel_size>  
  <offset>40</offset>
  <bolt_pattermn>5x112</bolt_pattermn>
  <brand>AEZ</brand>
  <Velg_ID>AEZ Myta</Velg_ID>
  <kit1>DK-ZJAE x1</kit1>
</Item>

ターゲット XML:

<Item>
  <stockcode>XXX1</stockcode>
  <vehicle>Bentley</vehicle>
  <model>Continental GT (2006-)</model>
  <width>9</width>
  <wheel_size>20</wheel_size>    
  <offset>40</offset>
  <bolt_pattermn>5x112</bolt_pattermn>
  <brand>AEZ</brand>
  <Velg_ID>AEZ Myta</Velg_ID>
  <kit1>DK-ZJAE x1</kit1>
  <qty_available>8.00000000</qty_available>
  <price>174.00</price>
  <picture>41010</picture>
  <pkpcena>195.4999</pkpcena>
</Item>
<Item>
  <stockcode>XXX1</stockcode>
  <vehicle>Bentley</vehicle>
  <model>Continental Flying Spur (2006-)</model>
</Item>

ソース XML には、X ノードの 1 つの要素に分割する必要がある 1 つのノードの X 要素があります。ターゲット XML には、すべての要素をソースと同じように含めることも、要素<vehicle><model>!

はいの場合 - 誰かがヒントをくれますか? ;-)

ありがとう!

4

2 に答える 2

1

これはそれを行います:

<xsl:stylesheet version="1.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>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <root>
      <xsl:apply-templates select="//model" mode="split" />
    </root>
  </xsl:template>

  <xsl:template match="model" mode="split">
    <xsl:apply-templates select="..">
      <xsl:with-param name="currentModel" select="." />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="Item">
    <xsl:param name="currentModel" />

    <xsl:copy>
      <xsl:apply-templates
         select="@* | node()[not(self::model)] | $currentModel" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

サンプル入力に適用すると、次のようになります。

<root>
  <Item>
    <stockcode>XXX1</stockcode>
    <vehicle>Bentley</vehicle>
    <model>Continental GT (2006-)</model>
    <width>9</width>
    <wheel_size>20</wheel_size>
    <offset>40</offset>
    <bolt_pattermn>5x112</bolt_pattermn>
    <brand>AEZ</brand>
    <Velg_ID>AEZ Myta</Velg_ID>
    <kit1>DK-ZJAE x1</kit1>
  </Item>
  <Item>
    <stockcode>XXX1</stockcode>
    <vehicle>Bentley</vehicle>
    <model>Continental Flying Spur (2006-)</model>
    <width>9</width>
    <wheel_size>20</wheel_size>
    <offset>40</offset>
    <bolt_pattermn>5x112</bolt_pattermn>
    <brand>AEZ</brand>
    <Velg_ID>AEZ Myta</Velg_ID>
    <kit1>DK-ZJAE x1</kit1>
  </Item>
</root>

これは、上記のアプローチを短縮した実装であり、ディミトレのテクニックからのいくつかのポインターがあります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="model">
    <xsl:apply-templates select=".." mode="gen">
      <xsl:with-param name="currentModel" select="." />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="@* | node()" mode="gen">
    <xsl:param name="currentModel" select="/.." />

    <xsl:copy>
      <xsl:apply-templates
         select="@* | node()[not(self::model)] | $currentModel" 
         mode="gen" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="text()" />
</xsl:stylesheet>
于 2013-03-10T14:20:43.350 に答える
0

I. この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:template match="text()"/>

 <xsl:template match="model">
  <xsl:apply-templates select=".." mode="gen">
   <xsl:with-param name="pInclude" select="."/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="node()|@*" mode="gen">
  <xsl:param name="pInclude" select="/.."/>
      <xsl:copy>
       <xsl:apply-templates mode="gen" select=
        "node()[not(name()=name($pInclude)) or count(.|$pInclude)=1]|@*" >
        <xsl:with-param name="pInclude" select="$pInclude"/>
       </xsl:apply-templates>
      </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

この XML ドキュメント (提供されたものに 3 番目の要素modelが追加され、複数のItem要素が追加されたもの)に適用すると、次のようになります。

<t>
    <Item>
        <stockcode>XXX1</stockcode>
        <vehicle>Bentley</vehicle>
        <model>Continental GT (2006-)</model>
        <model>Continental Flying Spur (2006-)</model>
        <model>Galactic Flying Spur (2006-)</model>
        <width>9</width>
        <wheel_size>20</wheel_size>
        <offset>40</offset>
        <bolt_pattermn>5x112</bolt_pattermn>
        <brand>AEZ</brand>
        <Velg_ID>AEZ Myta</Velg_ID>
        <kit1>DK-ZJAE x1</kit1>
    </Item>
    <Item>
        <stockcode>XXX1</stockcode>
        <vehicle>Bentley</vehicle>
        <model>XXX Continental GT (2006-)</model>
        <model>YYY Continental Flying Spur (2006-)</model>
        <model>ZZZ Galactic Flying Spur (2006-)</model>
        <width>9</width>
        <wheel_size>20</wheel_size>
        <offset>40</offset>
        <bolt_pattermn>5x112</bolt_pattermn>
        <brand>AEZ</brand>
        <Velg_ID>AEZ Myta</Velg_ID>
        <kit1>DK-ZJAE x1</kit1>
    </Item>
</t>

必要な正しい結果が生成されます。

<Item>
   <stockcode>XXX1</stockcode>
   <vehicle>Bentley</vehicle>
   <model>Continental GT (2006-)</model>
   <width>9</width>
   <wheel_size>20</wheel_size>
   <offset>40</offset>
   <bolt_pattermn>5x112</bolt_pattermn>
   <brand>AEZ</brand>
   <Velg_ID>AEZ Myta</Velg_ID>
   <kit1>DK-ZJAE x1</kit1>
</Item>
<Item>
   <stockcode>XXX1</stockcode>
   <vehicle>Bentley</vehicle>
   <model>Continental Flying Spur (2006-)</model>
   <width>9</width>
   <wheel_size>20</wheel_size>
   <offset>40</offset>
   <bolt_pattermn>5x112</bolt_pattermn>
   <brand>AEZ</brand>
   <Velg_ID>AEZ Myta</Velg_ID>
   <kit1>DK-ZJAE x1</kit1>
</Item>
<Item>
   <stockcode>XXX1</stockcode>
   <vehicle>Bentley</vehicle>
   <model>Galactic Flying Spur (2006-)</model>
   <width>9</width>
   <wheel_size>20</wheel_size>
   <offset>40</offset>
   <bolt_pattermn>5x112</bolt_pattermn>
   <brand>AEZ</brand>
   <Velg_ID>AEZ Myta</Velg_ID>
   <kit1>DK-ZJAE x1</kit1>
</Item>
<Item>
   <stockcode>XXX1</stockcode>
   <vehicle>Bentley</vehicle>
   <model>XXX Continental GT (2006-)</model>
   <width>9</width>
   <wheel_size>20</wheel_size>
   <offset>40</offset>
   <bolt_pattermn>5x112</bolt_pattermn>
   <brand>AEZ</brand>
   <Velg_ID>AEZ Myta</Velg_ID>
   <kit1>DK-ZJAE x1</kit1>
</Item>
<Item>
   <stockcode>XXX1</stockcode>
   <vehicle>Bentley</vehicle>
   <model>YYY Continental Flying Spur (2006-)</model>
   <width>9</width>
   <wheel_size>20</wheel_size>
   <offset>40</offset>
   <bolt_pattermn>5x112</bolt_pattermn>
   <brand>AEZ</brand>
   <Velg_ID>AEZ Myta</Velg_ID>
   <kit1>DK-ZJAE x1</kit1>
</Item>
<Item>
   <stockcode>XXX1</stockcode>
   <vehicle>Bentley</vehicle>
   <model>ZZZ Galactic Flying Spur (2006-)</model>
   <width>9</width>
   <wheel_size>20</wheel_size>
   <offset>40</offset>
   <bolt_pattermn>5x112</bolt_pattermn>
   <brand>AEZ</brand>
   <Velg_ID>AEZ Myta</Velg_ID>
   <kit1>DK-ZJAE x1</kit1>
</Item>

Ⅱ.分割する要素名が (外部) パラメータとして渡される、より一般的で短い変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:param name="pName" select="'model'"/>

 <xsl:template match="*">
  <xsl:apply-templates select="parent::*[$pName = name(current())]" mode="gen">
   <xsl:with-param name="pInclude" select="."/>
  </xsl:apply-templates>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="node()|@*" mode="gen">
  <xsl:param name="pInclude" select="/.."/>

      <xsl:copy>
       <xsl:apply-templates mode="gen" select=
       "node()[not(name()=name($pInclude)) or count(.|$pInclude)=1]|@*" >
        <xsl:with-param name="pInclude" select="$pInclude"/>
       </xsl:apply-templates>
      </xsl:copy>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

III. この種の一般的な問題に対する最も一般的な解決策:

この回答を参照してください: https://stackoverflow.com/a/8597577/36305

于 2013-03-10T18:33:49.980 に答える