【问题标题】:xslt namespace prefix not getting removedxslt 命名空间前缀没有被删除
【发布时间】:2025-11-24 22:10:01
【问题描述】:

我在这里检查了多个帖子添加了排除结果前缀,也尝试了指定

<xsl:template match="pc:*" priority="-0.2">
    <xsl:element name="{local-name()}">
      <xsl:copy-of select="*"/>
    </xsl:element>
  </xsl:template>

我已经尝试了所有这些方法,但命名空间前缀仍然没有被删除。

有人可以帮我如何删除命名空间并将其放在顶部

例如:

Input xml

    <Workstart>
       <Work/>
    </Workstart>

XSLT

<xsl:stylesheet version="1.0"  xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="pc">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Work">
      <xsl:apply-templates select="@*"/>
      <pc:test1/>
  </xsl:template>
</xsl:stylesheet>

所需的输出 xml

    <Workstart xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" >
      <Work>
       <pc:test1/>
      </Work>
    </Workstart>

【问题讨论】:

  • 为什么你需要的输出没有前缀pc的命名空间声明?这是一个无效的 XML。 &lt;Work&gt; &lt;test1/&gt; &lt;/Work&gt; 有道理
  • 它只是从一个 xml 到另一个 xml 的转换
  • 而且您的输出不是有效的 XML! XML 不能包含未声明的前缀。您的输出有 pc 前缀,它不与任何命名空间相关联。
  • 您的“test1”节点属于一个特定的命名空间,该命名空间由您提供的前缀表示。你不能去掉一个节点的命名空间,仍然通过前缀说一个特定的节点属于一个特定的命名空间

标签: xslt namespaces


【解决方案1】:

回复您编辑的问题:

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
<xsl:output method="xml" omit-xml-declaration="yes" 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="/Workstart">
    <Workstart>
        <xsl:apply-templates select="@* | node()" />
    </Workstart>
</xsl:template>

<xsl:template match="Work">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
        <pc:test1/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

当应用于您的新 输入 示例时:

<Workstart>
    <Work/>
</Workstart>

将返回以下结果*

<Workstart xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls">
   <Work>
      <pc:test1/>
   </Work>
</Workstart>

--
(*) 正如我之前提到的,确切结果可能取决于您的特定处理器。

【讨论】:

  • 嘿,我的主要问题是我想删除名称空间前缀。如果我按照您所说的删除命名空间,它不会给我 pc:tes1 ,只会给 test1。这不是我所期望的。
  • 正如我所说,没有命名空间就不能有前缀。你可以有一个没有前缀的命名空间(见我帖子的结尾),但反过来不行圆形。
  • 我同意你的说法,但我希望该前缀位于声明的顶部,而在这里我不想看到它
  • 是否可以如上所示在顶部声明
  • 当我尝试时,这不会将声明更改为顶部.. 有没有其他方法可以更改它。请查看编辑