我是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的值更改为&#34; TTT&#34;并删除attributeID 6。
但是,如果我想在属性3的值上删除属性6,我会添加如下内容:
<xsl:template match="order//orderAttributes[attributeID='6'][preceding::orderAttributes[attributeIDX9='3' and valueX9='TTT']]">
当然这不起作用,因为XSLT不是程序性的,只能在源树上工作。 尝试将参数用作条件也无法完成,因为我不能在匹配模式中使用变量。
有什么方法可以做这样的事吗? (为了示例的目的,我将attribute3的默认值设为&#39; TTT&#39;,但这是一个输入参数,可以由使用此XSLT的任何人更改)
答案 0 :(得分: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
参数不会在任何地方使用。