Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT替换xml标记_Xml_Xslt - Fatal编程技术网

使用XSLT替换xml标记

使用XSLT替换xml标记,xml,xslt,Xml,Xslt,我有一个xml文件,需要在其中替换一个标记,而不替换名称空间的传入前缀。例如,对于以下XML: <f:table xmlns:f="https://www.test.com">   <f:name>Peter</f:name>   <f:lname>Jenkins</f:lname>   <f:height>71</f:height> </f:table> 彼得 詹金斯   71 我需要用la

我有一个xml文件,需要在其中替换一个标记,而不替换名称空间的传入前缀。例如,对于以下XML:

 <f:table xmlns:f="https://www.test.com">
  <f:name>Peter</f:name>
  <f:lname>Jenkins</f:lname>
  <f:height>71</f:height>
</f:table>

彼得
詹金斯
  71
我需要用lastname替换lname,但仍然保持前缀(在本例中为f)不变。期望的输出如下所示。请注意,前缀可以更改,因此它不会始终为f

<f:table xmlns:f="https://www.test.com">
  <f:name>Peter</f:name>
  <f:lastname>Jenkins</f:lastname>
  <f:height>71</f:height>
</f:table>

彼得
詹金斯
  71
我尝试过使用以下XSLT,这将用lastname替换lname,而不保留原始前缀。请帮忙

<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="table/lname">
        <lastname><xsl:apply-templates select="@*|node()" /></lastname>
    </xsl:template>
</xsl:stylesheet>

前缀没有意义。以下样式表:

XSLT1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="https://www.test.com">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="ns0:lname">
    <ns0:lastname>
        <xsl:apply-templates/>
    </ns0:lastname>
</xsl:template>

</xsl:stylesheet>

应用于输入示例时,将返回:

<?xml version="1.0" encoding="UTF-8"?>
<f:table xmlns:f="https://www.test.com">
  <f:name>Peter</f:name>
  <ns0:lastname xmlns:ns0="https://www.test.com">Jenkins</ns0:lastname>
  <f:height>71</f:height>
</f:table>

彼得
詹金斯
71
这在语义上与问题中显示的输出相同


如果出于某种原因确实需要保留原始前缀,可以执行以下操作:

<xsl:template match="ns0:lname">
    <xsl:variable name="uri" select="'https://www.test.com'" />
    <xsl:variable name="prefix" select="name(namespace::*[.=$uri])" />
    <xsl:element name="{$prefix}:lastname" namespace="{$uri}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>