如何使用xpath作为XSLT 1.0中的输入从XML中删除元素

时间:2017-08-10 10:45:45

标签: xml xslt xpath

我有一个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值的变量传递给第二个模板。那可能吗?

1 个答案:

答案 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输入的可能性。