2016-08-25 7 views
0

私はむしろXSLTの新機能です。変数を使ってXSLTのノードを削除する

XMLの別のノードの値に基づいて、XMLからノードを削除しようとしていました。 「

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="1.0"> 

    <xsl:param name="Attribute2" select="'BBB'" /> 
    <xsl:param name="Attribute3" select="'TTT'" /> 

    <xsl:output method="xml" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="orderAttributes"> 
     <xsl:choose> 
      <xsl:when test="attributeID[text()=3]"> 
       <attributeValueChangeX9> 
        <attributeID>3</attributeID> 
        <attributeValue><xsl:value-of select="$Attribute3"/></attributeValue> 
       </attributeValueChangeX9> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:copy> 
        <xsl:apply-templates select="@*|node()"/> 
       </xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template match="order//orderAttributes[attributeID='6']"> 
    </xsl:template> 

これはにattributeID 3の値を変更します:

<root> 
    <body> 
     <order> 
      <orderAttributes> 
       <attributeID>1</attributeID> 
       <attributeValue>AAA</attributeValue>    
      </orderAttributes> 
      <orderAttributes> 
       <attributeID>2</attributeID> 
       <attributeValue>BBB</attributeValue>        
      </orderAttributes>    
     </order> 
     <order> 
      <orderAttributes> 
       <attributeID>3</attributeID> 
       <attributeValue>CCC</attributeValue>    
      </orderAttributes> 
      <orderAttributes>     
       <attributeID>4</attributeID> 
       <attributeValue>DDD</attributeValue>    
      </orderAttributes>   
     </order> 
     <order> 
      <orderAttributes>    
       <attributeID>5</attributeID> 
       <attributeValue>EEE</attributeValue>    
      </orderAttributes> 
      <orderAttributes>     
       <attributeID>6</attributeID> 
       <attributeValue>FFF</attributeValue>    
      </orderAttributes>   
     </order> 
    </body> 
</root> 

と私は(1.0のver)以下のXSLTを持っている:

のは、私はこのXMLを持っているとしましょうTTT "を削除してattributeID 6を削除します。

ただし、属性6の削除をtもちろん

<xsl:template match="order//orderAttributes[attributeID='6'][preceding::orderAttributes[attributeIDX9='3' and valueX9='TTT']]"> 

XSLTで手続きではなく、唯一のソースツリー上で動作するよう、これは動作しません:彼は、属性3の値私はこのようなものを追加します。 パラメータを条件として使用しようとすると、一致パターンで変数を使用できないため、どちらも実行できません。

このようなことができる方法はありますか? (例の目的のために、私は「TTT」としてattribute3のデフォルト値を与えたが、これは、このXSLTを使用しています誰によって変更することができる入力パラメータである)

+0

"*属性3の値に属性6の削除を基にしたい*"それはどういう意味ですか?アトリビュート3の値が...何であれば、アトリビュート6を削除しますか? –

+0

私の例で示したように - 値がTTTのとき。しかし、TTTはXSLTでのみ発生しています –

+0

あなたの例では、属性3の値は "CCC"です。入力に基づいて条件を定式化してください(必要に応じてパラメータを含む)。 –

答えて

0

AFAICT、あなたがやろうとしている。

Attribute2パラメータがどこにも使用されていないことを

XSLT 1.0

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

<xsl:param name="Attribute2" select="'BBB'" /> 
<xsl:param name="Attribute3" select="'TTT'" /> 

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

<xsl:template match="orderAttributes[attributeID='3']"> 
    <attributeValueChangeX9> 
     <attributeID>3</attributeID> 
     <attributeValue> 
      <xsl:value-of select="$Attribute3"/> 
     </attributeValue> 
    </attributeValueChangeX9> 
</xsl:template> 

<xsl:template match="orderAttributes[attributeID='6']"> 
    <xsl:if test="$Attribute3 != 'TTT'"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

注意。

+0

Gr8、ありがとう、これは私が必要なものです。 –

関連する問題