如何在 XSLT 的参数中指定的 xpath 位置添加变量中指定的元素?
How to add an element specified in a variable at a xpath location specified in param in XSLT?
我想将 xml 元素添加到 xml 文档中的指定位置。
问题是,该元素将在参数中,并且位置(即 xpath)也在 xslt 样式表的参数中指定。
XML 看起来像这样:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
XPATH=/soap:Envelop/soap:正文
要添加 xml 个元素的变量 = <customer>foo</customer>
(要添加的 xml 元素是从外部配置添加到参数中的,我正在使用 saxon:parse(param_name) 将其存储在变量中。)
如果您使用的是 Saxon,那么您可以利用 saxon:eval()
函数从 $path
参数计算 XPath。
下面是一个示例,它使用变量中的结果计算 XPath,并将其用于模板匹配模式以测试 $eval
的 generate-id()
是否等于匹配的 generate-id()
元素。如果匹配,则它将使用 parse-xml()
添加 $add
参数作为 XML 作为该元素的子元素。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.1"
xmlns:saxon="http://saxon.sf.net/"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/">
<xsl:param name="path" select="'/soap:Envelope/soap:Body'"/>
<xsl:param name="add" select="'<customer>foo</customer>'"/>
<xsl:variable name="eval" select="saxon:eval(saxon:expression($path))" as="item()*"/>
<xsl:mode on-no-match="shallow-copy" />
<xsl:template match="*[. is $eval]">
<xsl:copy>
<xsl:sequence select="@*, parse-xml($add), node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我想将 xml 元素添加到 xml 文档中的指定位置。 问题是,该元素将在参数中,并且位置(即 xpath)也在 xslt 样式表的参数中指定。
XML 看起来像这样:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3schools.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
XPATH=/soap:Envelop/soap:正文
要添加 xml 个元素的变量 = <customer>foo</customer>
(要添加的 xml 元素是从外部配置添加到参数中的,我正在使用 saxon:parse(param_name) 将其存储在变量中。)
如果您使用的是 Saxon,那么您可以利用 saxon:eval()
函数从 $path
参数计算 XPath。
下面是一个示例,它使用变量中的结果计算 XPath,并将其用于模板匹配模式以测试 $eval
的 generate-id()
是否等于匹配的 generate-id()
元素。如果匹配,则它将使用 parse-xml()
添加 $add
参数作为 XML 作为该元素的子元素。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.1"
xmlns:saxon="http://saxon.sf.net/"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/">
<xsl:param name="path" select="'/soap:Envelope/soap:Body'"/>
<xsl:param name="add" select="'<customer>foo</customer>'"/>
<xsl:variable name="eval" select="saxon:eval(saxon:expression($path))" as="item()*"/>
<xsl:mode on-no-match="shallow-copy" />
<xsl:template match="*[. is $eval]">
<xsl:copy>
<xsl:sequence select="@*, parse-xml($add), node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>