dポイントプレゼントキャンペーン実施中!

次のようなXMLからhide属性ない箇所のテキストのみを抜き出したいのですが、
どうすればよいでしょうか?

[xml]
<data>
××××<a hide="hide">○○○○○○○○○○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△
</data>

[求める結果]
××××・◎◎◎◎◎▲▲▲▲△△△△

A 回答 (1件)

<?xml version="1.0" encoding="UTF-8"?>


<data>
××××<a hide="hide">○○○○○<c>*****</c>○○○</a>・<a>◎◎◎◎◎<b hide="hide">●●●</b>▲▲▲▲</a>△△△△
</data>
==================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<test>
<xsl:apply-templates />
</test>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="count(@hide) > 0">
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

============結果=====================
<?xml version="1.0" encoding="UTF-8"?>
<test>××××・◎◎◎◎◎▲▲▲▲△△△△</test>
=====================================
* 特に指示がなかったので、c要素のように「その要素自身にはhide属性はないが、その親にhide属性がある」ような要素は内容を表示しないことにした。特に指示がなかったので、その要素の名前空間(接頭辞がない奴)以外の「接頭辞のある属性」についてはhide属性としては扱わないものとしている。(今後指示がついてもやらないけど)

* 今考えると、xsl:apply-templatesのselect属性に指定するXPathで、hide属性のない要素だけが対象となるようにしてもよかったかも、とも思うがまぁいいや。

この回答への補足

<xsl:apply-templates select="data/text() | data//*[not(@hide='hide') and not(../@hide='hide')]/text()" />

のような形かな?っと思いますが、親階層にhide属性がある場合(複数階層の場合)、表示されてしまいます。

全ての親階層をたどり判断するようなことは出来ないのでしょうか?

補足日時:2014/07/29 17:20
    • good
    • 0
この回答へのお礼

ありがとうございました。
ずっと悩んでいたんですが、スッキリです。

>* 今考えると、xsl:apply-templatesのselect属性に指定するXPathで、hide属性のない要素だけが対>象となるようにしてもよかったかも、とも思うがまぁいいや。

出来たら、こっちのやり方も教えてもらえるとうれしいです。

今後の参考のために、よろしくお願いします。

お礼日時:2014/07/29 08:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!