有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用名称空间替换java 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>

共 (1) 个答案

  1. # 1 楼答案

    有两种方法。或者在样式表标记中包含“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:namecompany:name),通过使用local-name()可以忽略这种区别。换句话说,如果您的文档碰巧包含foo:account/foo:name,您也会意外地替换它

    顺便说一句,上一个示例XML无效-未声明my名称空间。你的根目录my:accounts需要在<my:accounts xlmns:my="(insertnamespacehere)">中包含这个