2

私は XSLT の世界ではまったく新しいのですが、XML を持っています。

<Response>
<Campaign Position_Aut="1" Campaign_Id="A" Campaign_Status="Active" >
    <Groups Name="gplust_campaign_test_group"></Groups>
    <Groups Name="g1"><Position PositionId="1-6MOJ6"></Position></Groups>
</Campaign>
<Campaign Position_Aut="1" Campaign_Id="B" Campaign_Status="Active" >
    <Groups Name="g2"></Groups>
</Campaign>
<Campaign Position_Aut="1" Campaign_Id="C" Campaign_Status="Completed" >
</Campaign>
</Response>

xml を変更する必要があるため、キャンペーンに位置がある場合、属性 Position_Aut を「1」ではなく「0」にして、キャンペーンのすべての子を無視する必要があります。これは私が必要とする XML 結果です:

<Response>
<Campaign Position_Aut="0" Campaign_Id="A" Campaign_Status="Active" ></Campaign>
<Campaign Position_Aut="1" Campaign_Id="B" Campaign_Status="Active" ></Campaign>
<Campaign Position_Aut="1" Campaign_Id="C" Campaign_Status="Completed" ></Campaign>
</Response>

XSLT はどのように見えるべきですか? 助けてください。何かが明確でない場合は、私に尋ねてください。ありがとう、バクブク。

4

2 に答える 2

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

<xsl:template match="@*|node()">
 <xsl:copy>
   <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<xsl:template match="@Position_Aut[../Groups/Position]">
  <xsl:attribute name="{name()}">
    <xsl:value-of select="'0'" /> 
  </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

...出力を生成します...

<Response>
  <Campaign Position_Aut="0" Campaign_Id="A" Campaign_Status="Active">
    <Groups Name="gplust_campaign_test_group" />
    <Groups Name="g1">
      <Position PositionId="1-6MOJ6" />
    </Groups>
  </Campaign>
  <Campaign Position_Aut="1" Campaign_Id="B" Campaign_Status="Active">
    <Groups Name="g2" />
  </Campaign>
  <Campaign Position_Aut="1" Campaign_Id="C" Campaign_Status="Completed" />
</Response>

アップデート

キャンペーンの子を削除するには、このテンプレートを含めます...

<xsl:template match="Campaign">
 <xsl:copy>
   <xsl:apply-templates select="@*"/>
 </xsl:copy>
</xsl:template>
于 2012-11-20T11:57:10.620 に答える
0

シンプルで完全な変換を次に示します

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

 <xsl:template match="Campaign[Groups/Position]">
  <Campaign Position_Aut="0">
   <xsl:apply-templates select="@*[not(name()='Position_Aut')]"/>
  </Campaign>
 </xsl:template>
 <xsl:template match="Campaign/node()"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<Response>
 <Campaign Position_Aut="1" Campaign_Id="A" Campaign_Status="Active" >
    <Groups Name="gplust_campaign_test_group"></Groups>
    <Groups Name="g1"><Position PositionId="1-6MOJ6"></Position></Groups>
 </Campaign>
 <Campaign Position_Aut="1" Campaign_Id="B" Campaign_Status="Active" >
    <Groups Name="g2"></Groups>
 </Campaign>
 <Campaign Position_Aut="1" Campaign_Id="C" Campaign_Status="Completed" >
 </Campaign>
</Response>

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

<Response>
   <Campaign Position_Aut="0" Campaign_Id="A" Campaign_Status="Active"/>
   <Campaign Position_Aut="1" Campaign_Id="B" Campaign_Status="Active"/>
   <Campaign Position_Aut="1" Campaign_Id="C" Campaign_Status="Completed"/>
</Response>

説明:

ID ルールの適切な使用とオーバーライド-- これは最も基本的な XSLT 設計パターンです。

于 2012-11-20T14:02:30.630 に答える