2016-08-25 2 views
0

Я довольно новичок в XSLT.Использование переменной для удаления узла в XSLT

Я пытался удалить узел из моего XML на основе значения другого узла в XML.

скажем, у меня есть этот XML:

<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> 

и у меня есть следующий XSLT (версия 1.0):

<?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 к " TTT "и удалить attributeID 6.

Однако, если я хочу основать удаление атрибута 6 на t он значение атрибута 3 Я хотел бы добавить что-то вроде этого:

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

Конечно, это не будет работать, так как XSLT не процедурный и будет работать только на исходном дереве. Невозможно выполнить попытку использовать параметр как условие, так как я не могу использовать переменные в шаблоне соответствия.

Есть ли способ, я могу сделать что-то вроде этого? (для целей примера я дал значение по умолчанию attribute3 как «ТТТ», но это входной параметр, который может быть изменен, кто использует этот XSLT)

+0

«* Я хочу основать удаление атрибута 6 по значению атрибута 3 *« Что именно это означает? Вы хотите удалить атрибут 6, когда значение атрибута 3 ... что? –

+0

как показано в моем примере - когда значение TTT. Однако TTT происходит только в XSLT –

+0

В вашем примере значение атрибута 3 является «CCC». Пожалуйста, сформулируйте условие на основе ввода (включая, если необходимо, параметры), а не на выходе. –

ответ

0

AFAICT, вы пытаетесь сделать:

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> 

Обратите внимание, что параметр Attribute2 не используется в любом месте.

+0

Gr8, спасибо, это то, что мне нужно. –

Смежные вопросы