0

私は次のXMLコードを持っています。

タグDescriptionが繰り返されていますが、属性が異なります。

XSLTを使用して、有効な属性を持つDescriptionタグを削除しようとしています。

<Batch>
- <Promotion>
  <LastUpdated>2008-01-22T11:58:05+00:00</LastUpdated> 
  <MajorVersion>1</MajorVersion> 
  <MinorVersion>29</MinorVersion> 
  <PromotionID>000873</PromotionID> 
  <Description enabled="1">*P* Free Mistletoe</Description> 
  <Description country="GB" language="en" variant="">WANTED LINE 1</Description>
 </Promotion>
 <Promotion>
   <LastUpdated>2008-01-22T11:58:05+00:00</LastUpdated> 
   <MajorVersion>1</MajorVersion> 
   <MinorVersion>29</MinorVersion> 
   <PromotionID>000874</PromotionID> 
   <Description enabled="1">*P* Free Mistletoe</Description> 
   <Description country="GB" language="en" variant="">WANTED LINE 2</Description>
 </Promotion> 
</batch>

これは私が到達しようとしていることです、他のタグがあります、それは私が解決しようとしている属性に基づいて1行を削除することです。

- <promotions>
-   <promotion>
      <promotionID>000873</promotionID> 
      <description country="GB" language="en" variant="">WANTED LINE 1</description>
    </promotion>
-   <promotion> 
      <promotionID>000874</promotionID> 
      <description country="GB" language="en" variant="">WANTED LINE 2</description>
    </promotion> 
  </promotions>

私が使用しているXSLTコードは

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

<xsl:template match="node()|@*">
  <xsl:copy>
  <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="//promotion/Description[@country='GB']"/> 
<xsl:template match="/"> 

<promotions> 
<xsl:for-each select="Batch/Promotion">  
  <promotion>
    <promotion_id><xsl:value-of select="PromotionID"/></promotion_id>    
    <description><xsl:value-of select="Description"/></description>
  </promotion>
</xsl:for-each>   
</promotions>   
</xsl:template>
</xsl:stylesheet> 

誰かが私を正しい方向に向けることができれば、私は非常に感謝するでしょう。

ポール

4

3 に答える 3

0

通常、要素を削除するには、コンテンツのないテンプレートを指定する必要があります。あなたの場合、これは次のようになります。

<xsl:template match="/Batch/Promotion/Description[@enabled = '1']"/>

ただし、XSLTコードでは、独自の<description>要素を作成するという特殊なケースがあります。目的の<Description>要素の値を正確に取得するには、要素でその値を選択します<xsl:value-of>

<description><xsl:value-of select="Description[@country = 'GB']"/></description>

これはあなたがあなたの質問で説明したことです、しかしあなたの期待される結果コードはあなたがすでに<Description>要素の属性をコピーしたいことを意味しますか?その場合、私はこの解決策を次のように使用し<xsl:copy-of>ます。

<description><xsl:copy-of select="Description[@country = 'GB']/node()|Description[@country = 'GB']/@*"/></description>

<Description>要素の内容全体( node())とその属性(@*)をコピーします。

于 2012-06-28T13:18:10.770 に答える
0

for-eachandを使用する代わりに、代わりにvalue-ofさらに多くのテンプレートを使用することを検討してください。

以下のコードのコメントに注意してください。

<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()|@*">  <!-- identity template: copies everything by default -->
  <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>

<!-- instead of an explicit for-each, just apply templates -->
<xsl:template match="/">
<promotions><xsl:apply-templates/></promotions>
</xsl:template>

<!-- We ignore Batch, but apply templates on contents -->
<xsl:template match="Batch"><xsl:apply-templates/></xsl:template>

<!-- Rename the Promotion element -->
<xsl:template match="Promotion">
<promotion><xsl:apply-templates/></promotion>
</xsl:template>

<!-- we make an exception for subelements of Promotion: here we delete by default -->
<!-- we give this template a lower priority so we can override it with other rules -->
<xsl:template match="Promotion/*" priority="-0.5"/>

<!-- The templates that follow are exceptions to the "Promotion/*" no-copy template: -->

<!-- Only copy Description elements with the right country code -->
<!-- Remember that the "Promotion/*" template will delete any other Description elements for us -->
<xsl:template match="Description[@country='GB']">
<description><xsl:apply-templates/></description>
</xsl:template>

<!-- Rename the PromotionID element -->
<xsl:template match="PromotionID">
   <promotion_id><xsl:apply-templates/></promotion_id>
</xsl:template>

</xsl:stylesheet> 
于 2012-06-28T13:37:51.650 に答える
0

<xsl:value-of select="Description[not(string(@enabled))]"/>の代わりに使用してみてください<xsl:value-of select="Description"/>

完全な例:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="//promotion/Description[@country='GB']"/>
<xsl:template match="/">
    <promotions>
        <xsl:for-each select="Batch/Promotion">
            <promotion>
                <promotion_id>
                    <xsl:value-of select="PromotionID"/>
                </promotion_id>
                <description>
                    <xsl:value-of select="Description[not(string(@enabled))]"/>
                </description>
            </promotion>
        </xsl:for-each>
    </promotions>
</xsl:template>

結果は次のとおりです。

<?xml version="1.0" encoding="UTF-16"?>
    <promotions>
    <promotion>
        <promotion_id>000873</promotion_id>
        <description>WANTED LINE 1</description>
    </promotion>
    <promotion>
        <promotion_id>000874</promotion_id>
        <description>WANTED LINE 2</description>
    </promotion>
</promotions>

多分それはあなたを助けます。

マルコ

于 2012-06-28T13:42:46.903 に答える