如何在 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,并将其用于模板匹配模式以测试 $evalgenerate-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="'&lt;customer>foo&lt;/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>