java - 用命名空间替换 XSLT?

标签 java xml xslt

如果我有一个带有命名空间的 xml,并且想要应用一些值替换,我需要更改什么? http://xslt.online-toolz.com/tools/xslt-transformation.php

<?xml version="1.0"?>
<accounts>
<account>
<name>Alex</name>
</account>
<account>
<name>Fiona</name>
</account>
</accounts>

这会将所有名称值更改为“Johndoe”:

<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="account/name/text()">
   <xsl:text>JohnDoe</xsl:text>
  </xsl:template>
</xsl:stylesheet>

但是如果我在标签之前有一个命名空间怎么办,例如:

<?xml version="1.0"?>
<my:accounts>
<my:account>
<my:name>Alex</my:name>
</my:account>
<my:account>
<my:name>Fiona</my:name>
</my:account>
</my:accounts>

最佳答案

有两种方法可以做到这一点。在样式表标记中包含“my”命名空间,如下所示:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="(insertnamespacehere)">

然后做

<xsl:template match="my:account/my:name/text()" >

或者做更笨拙的事情:

<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()">

我倾向于不鼓励后一种方法 - 命名空间的存在是为了通过使用 employee:name 来区分具有相同本地名称的元素(例如 company:namelocal-name() )。你忽略了这个区别。换句话说,如果您的文档恰好包含 foo:account/foo:name ,您也会意外地替换它。

顺便说一句,您的最后一个示例 XML 无效 - my命名空间未声明。你的根my:accounts需要将其包含在 <my:accounts xlmns:my="(insertnamespacehere)">

关于java - 用命名空间替换 XSLT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13723406/

相关文章:

java - 如何使用正则表达式替换 xml 空标签

XSLT: "test"结果困惑

xml - 如何使用 XSLT 将换行符转换为 <br/>?

java - C/C++程序可以调用mapreduce程序吗

java.lang.outofmemory 异常 jvm 堆大小不足

java - 当我们有 MouseAdapter 类时,MouseMotionAdapter 类有什么用?

xml - 在 R 中解析具有重复元素名称的 XML

java - 如何将 .jar 文件添加到 .java 文件的编译中

xml - XSLT用于具有相同名称的多个元素

xml - XSLT 元素的逗号分隔