我有一个XML
<?xml version="1.0" encoding="utf-8"?>
<ns1:Student xmlns:ns1="http://test1.org/test1" xmlns:ns2="http://test2.org/test2" xmlns:ns3="http://test3.org/test3" xmlns:ns4="http://test4.org/test4">
<ns2:Details>
<ns3:Number>12</ns3:Number>
<ns3:Name>Rosh</ns3:Name>
</ns2:Details>
<ns2:Address>
<ns3:Number>45</ns3:Number>
<ns3:City>Blore</ns3:City>
</ns2:Address>
</ns1:Student>
我使用的是XSLT 1.0处理器
如何仅删除详细信息(ns1:Student/n2:Details/ns3:Number
)下的节点数字?
到目前为止,这对我有用..
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:param name="ElemToDelete" select="'/ns1:Student/ns2:Details/ns3:Number'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/ns1:Student/ns2:Details/ns3:Number"/>
但是我需要以这样的方式更改它,即我可以将包含xpath值的变量传递给第二个模板。那可能吗?
答案 0 :(得分:0)
简短回答:
这在XSLT 1.0中是不可能的 - 除非您的处理器支持某种evaluate()
扩展功能。
更长的答案:
XPath比你的示例节目更加通用。可以用各种方式表达相同的路径,例如:
/ns1:Student/n2:Details/ns3:Number
ns1:Student[1]/n2:Details[1]/ns3:Number[1]
pf1:Student/pf2:Details/pf3:Number
//ns3:Number[parent::n2:Details]
这些在给定XML的上下文中在语义上都是等效的。
理论上,您可以为给定XML中的每个节点构建自己的路径表达式,并将其与给定路径进行比较。在实践中,它需要一套严格的规则(比XPath语言提供的要严格得多),你和路径提供者都会遵守这些规则,这样你们两个都会得到完全相同的字符串。
修改强>:
我忘了提到使用给定路径创建新的XSLT样式表,然后将结果应用于原始XML输入的可能性。