1

名前空間を持つ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>
4

1 に答える 1

2

これを行う2つの方法。次のように、スタイルシートタグに「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:name区別local-name()を無視します。つまり、ドキュメントにが含まれているfoo:account/foo:name場合は、誤ってそれも置き換えてしまいます。

ちなみに、最後のサンプルXMLは無効です-my名前空間は宣言されていません。あなたのルートmy:accountsはこれを含める必要があります<my:accounts xlmns:my="(insertnamespacehere)">

于 2012-12-05T12:52:24.580 に答える