• 締切済み

■XSLT■固定文字を使ったループ処理について(サンプルのイメージソースあり)

いつも勉強させていただいております。 今回は質問をさせていただけないでしょうか。 それでは、よろしくお願いします。 下記のような感じで、アルファベット一文字づつ処理をしたいと思っています。 このような、処理はできますでしょうか? XMLにa-zの文字を入れておいて、各ノードのループで処理をすれば可能かと思いますが、 XMLが変えられないので、それ以外の方法を考えています。 下記はイメージですから、動作はしません。 <xsl:for-each select="'abcdefghijklmnopqrstuvwxyz'"> <!-- 下記により一文字づつ処理をする --> <xsl:call-template name="PutAlphabetHref" > <xsl:with-param name="sAlpha" select="substring(........)" /> </xsl:call-template> </xsl:for-each>

  • XML
  • 回答数1
  • ありがとう数7

みんなの回答

回答No.1

この結果がどうなるか考えると面白いかも。 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/*"> <hoge> <xsl:call-template name="stringiteration"> <xsl:with-param name="current" select="'abcdefghijklmnopqrstuvwxyz'" /> </xsl:call-template> </hoge> </xsl:template> <xsl:template name="stringiteration"> <xsl:param name="current" /> <fuga><xsl:value-of select="substring($current,1,1)" /></fuga> <xsl:if test="string-length($current) > 1"> <xsl:call-template name="stringiteration"> <xsl:with-param name="current" select="substring($current,2)" /> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet> <!-- XSLTの変数は同じ変数に何度も代入できないから再帰をうまく使う。-->

関連するQ&A

  • ■XSLT■複数のノードを違う属性でソートする方法は?(サンプルソース有り)

    いつも勉強させていただいております。 今回は質問をさせていただけないでしょうか。 下記のような、XMLファイルがあります。 <?xml version="1.0" encoding="Shift_JIS"?> <article> <Data> <Name Num="2">佐藤</Name> </Data> <Data> <Name Num="1">三田</Name> </Data> <UserMain> <UserMainData> <User> <NAMAE>伊藤</NAMAE> <No>6</No> </User> <User> <NAMAE>加藤</NAMAE> <No>3</No> </User> </UserMainData> </UserMain> </article> NumもしくはNoを使ってソートしたいと思っています。 つまり、下記のような出力を望んでいます。 1 三田 2 佐藤 3 加藤 6 伊藤 下記のような、感じで指定できれば一発でできると思うのですが 難しいようです。 <xsl:for-each select="Data/Name|UserMain/UserMainData/User/NAMAE"> <xsl:sort select="@Num|No" /> .... </xsl:for-each> つまり、複数のノードを違う属性でソートする方法です。 どなたか、良い知恵を教えていただけないでしょうか? 残念な事に、XMLの内容を変更することはできません。 それでは、よろしくお願いします。

    • ベストアンサー
    • XML
  • XSLTで、あるノードの Text を別なノードの Name として参照

     変換したいXML文書の最初のトップレベルノードの階層をたどって text を拾っていくと、その text に一致する name のノードが次のトップレベルノードの階層で、出現するようになっています。  そこで、まず、最初のノードの階層をたどっていって、その順序で、2番目のノードから値を引いてきて表示させたいのです。 ■変換したい XML 文書 DataDocument.xml <datadocument> <setteischema> <sitem>solution <scategory>solution1</scategory> </sitem> <sitem>itsales <scategory>itsales1</scategory> </sitem> </setteischema> <setteivalue> <solution> <solution1>ソリューション1</solution1> </solution> <itsales> <itsales1>ITセールス1</itsales1> </itsales> </setteivalue> </datadocument> それに対して、適用したい XSL は次のようなものです。 ■変換命令を記述したXSL文書 StyleDocument.xsl <xsl:template match="setteischema" > <xsl:for-each select="*"> <xsl:variable name="foo" select="text()"/> <xsl:for-each select="*"> <xsl:variable name="bar" select="text()"/> <xsl:value-of select="★1" /> </xsl:for-each> </xsl:for-each> </xsl:template> 実際は★1の部分で setteivalue/$foo/$var といったパスで得られるノードのテキストを表示させたいのです。 どうしたらできますか? よろしくお願いします。

    • ベストアンサー
    • XML
  • XSLTの処理について

    いつもお世話になっております。 XMLの動作についての質問です。以下のようなXMLファイルがあったとします。それに対して、その下のようなXSLファイルがあり、変換させると、結果XMLができます。 そこでわからないのは、test.xslの中ほどで、<xsl:template match="book/title/price">という風にXPath式でbook/title/priceと指定しているのに、結果には<title>の値も出力されます。なぜでしょうか。 自分のイメージとしては、<title>の値は出力されず<price>の値だけが出力されるのじゃないのかなっていう感じです。さらに<newTag>に<title>の値が挟まれていないのもなぜなのかわかりません。 お分かりになる方よろしくお願いします。もし参考文献に良いサイトや本がありましたらそちらも紹介をお願いします。 <<<test.xml>>> <?xml version="1.0" encoding="Shift_JIS"?> <books>  <book>   <title>    XMLとは    <price>2000</price>   </title>  </book>  <book>   <title>    XML概論    <price>1800</price>   </title>  </book>  <book>   <title>    XMLマスター    <price>4000</price>   </title>  </book> </books> <<<test.xsl>>> <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">  <answer>   <xsl:apply-templates select="books/book"/>  </answer> </xsl:template> <xsl:template match="book/title/price">  <newTag>   <xsl:value-of select="."/>  </newTag> </xsl:template> </xsl:stylesheet> <<<結果.xml>>> <?xml version="1.0" encoding="utf-8" ?> <answer> XMLとは <newTag>2000</newTag> XML概論 <newTag>1800</newTag> XMLマスター <newTag>4000</newTag> </answer>

    • ベストアンサー
    • XML
  • スタイルシートのfor-each select=に変数を使用したい

    お世話になります。 <xsl:param name="A" select="1000"> ・ ・ ・ <xsl:template name="B"> ・ ・ ・ <xsl:for-each select=".//1000"> -(1) </xsl:template> <xsl:template match="1000"> -(2) </xsl:template> (1) (1)の箇所の「1000」を上で宣言したAを使用したく、 <xsl:for-each select="concat('.//',$A")>  など色々試したのですが、うまくいきませんでした。 (2) (2)の箇所を「A」の変数に色々な形で置き換えてもうまくいきませんでした。 上記2点、を変数を使用して指定したいのですが、どのようにすれば実現できますでしょうか? 大変お手数とは思いますがよろしくお願いします。

    • ベストアンサー
    • XML
  • XMLからcsvへの変換

    下記のXMLのフィールドの項目を xslを使い、msxsl.exe経由で、csvへ変換をしたいのですが、 各field nameを抽出するのがうまくいきません。 copy condition=の箇所は必要ありません。 どなたかご教示のほど、お願いいたします。 ■XML <?xml version="1.0" encoding="UTF-8"?> <exportData> <Book id="id"> <field name="keywords"></field> <field name="listName"></field> <field name="publisher"></field> <field name="publishDate"></field> <field name="illustrators"></field> <field name="isbn"></field> <field name="length"></field> <field name="id"></field> <field name="series"></field> <field name="authors"></field> <field name="title"></field> <field name="summary"></field> <field name="format"></field> <field name="genre"></field> <field name="coverImage"></field> <field name="List Price"></field> <field name="URL"> </field> <field name="Current Value"></field> <field name="isbn13"></field> <copy condition="" dateAcquired="" location="Bookshelf" owner="" presentValue="" source=""> </copy> </Book> ■xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/">keywords,listName,publisher,publishDate,illustrators,isbn,length,id,series,authors,title,summary,format,genre,coverImage,URL,CurrentValue,isbn13 <xsl:apply-templates select="//Book"/> </xsl:template> <xsl:template match="Book"> <xsl:call-template name="keywords"/>,<xsl:call-template name="listName"/>,<xsl:call-template name="publisher"/>,<xsl:call-template name="publishDate"/>,<xsl:call-template name="illustrators"/>,<xsl:call-template name="isbn"/>,<xsl:call-template name="length"/>,<xsl:call-template name="id"/>,<xsl:call-template name="series"/>,<xsl:call-template name="authors"/>,<xsl:call-template name="title"/>,<xsl:call-template name="summary"/>,<xsl:call-template name="format"/>,<xsl:call-template name="genre"/>,<xsl:call-template name="coverImage"/>,<xsl:call-template name="URL"/>,<xsl:call-template name="CurrentValue"/>,<xsl:call-template name="isbn13"/><xsl:text> </xsl:text> </xsl:template> </xsl:stylesheet> よろしくお願いいたします。

    • ベストアンサー
    • XML
  • for-eachが上手くいきません

    xslを使ってごくごく基本的なことをしようとしているのですが、何故か上手くいかず煮詰まっています。 ここが違う!というツッコミを是非よろしくお願いします。 ごく単純なことですが、xmlで複数の<site></site>内にあるデータそれぞれ表示させるためxslファイル内でfor-eachを使っています。for-each抜きだと一つ目の<site></site>がちゃんと表示されるのですが、for-eachを付け加えた途端何も表示されなくなってしまいます。 参考書を見て何度確認、やり直しをしても上手くいかず困っています。 使っているコードは以下の通りです。 XMLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <?xml-stylesheet type="text/xsl" href="links.xsl" ?> <links> <site> <name>サイト1</name> <banner>some.jpg</banner> </site> <site> <name>サイト2</name> <banner>other.jpg</banner> </site> </links> XSLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title><title></head> <body> <table border="1"> <xsl:for-each select="links/site"> <tr> <td> <img> <xsl:attribute name="src"> <xsl:value-of select="links/site/banner" /> </xsl:attribute> </img> <b><xsl:value-of select="links/site/name" /></b> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 何かアドバイスがありましたらお聞かせ下さい。

    • ベストアンサー
    • XML
  • xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい

    次のXSLで動作させています。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> <xsl:for-each select="//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> ここまでは出来たのですが、xsl:sortでまとめてsortするにはどうすればいいのでしょうか?

    • ベストアンサー
    • XML
  • XSL中の改行、タブを無効にしたい。

    XMLドキュメントにXSLを適用すると XSL中の改行やタブがそのまま反映されてしまいます。 改行を無くすと1行が長くなってしまい編集が大変で困っています。 どうしたらよいのでしょうか? XSL: <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="//z:row"> <xsl:choose> <xsl:when test="(@MACHINE='DELL')"> </xsl:when> <xsl:when test="(@MACHINE='APPLE')"> </xsl:when> <xsl:when test="(@MACHINE='HP')"> </xsl:when> <xsl:otherwise> <xsl:value-of select="@MACHINE" />, <xsl:value-of select="substring(@PARTS_NO,1,1)" />-<xsl:value-of select="substring(@PARTS_NO,2,3)" />-<xsl:value-of select="substring(@PARTS_NO,5,3)" />-<xsl:value-of select="substring(@PARTS_NO,8,2)" />,<xsl:value-of select="@STATUS" />,<xsl:value-of select="@STOCK_NUM" /><xsl:text>&#xA;</xsl:text> <xsl:if test="not(@MACHINE=following-sibling::z:row/@MACHINE)"> <xsl:text>,&#xA;</xsl:text> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet>

    • ベストアンサー
    • XML
  • XSLT変換について

    以下のようにファイルを作成してみました。 ローカルではIEに表示できるのですが,アップすると表示されず「スタイルシートにドキュメント要素が含まれていません。スタイルシートが空であるか、正しく構成された XMLドキュメントでない可能性があります。」というコメントが出ます。ご存知の方いらっしゃいましたらどうか教えてください。 ↓作成したファイル 「top.xml」(省略) 「top.xsl」 <?xml version="1.0" encoding="Shift_JIS" ?> <xsl:stylesheet xmlns:xsl="(省略)" version="1.0"> <xsl:import href="./note.xsl" /> <xsl:output method="html" encoding="Shift_JIS" /> <xsl:template match="/">  <html xmlns="(省略)" xml:lang="ja" lang="ja">  <head>   <meta http-equiv="Content-Type"    content="text/html; charset=Shift_JIS" />   <title><xsl:value-of   select="/top/title" /></title>  </head>  <body>   <xsl:call-template name="header" />   <div align="center"><h1>HOME PAGE</h1></div>   <table> <tr><th>CONTENTS</th></tr> <xsl:for-each select="/top/contents"> <tr><th><a href="{url}"><xsl:value-of      select="label" /></a></th>      <td><small><xsl:value-of      select="text" /></small></td></tr> </xsl:for-each>   </table><br />   <xsl:call-template name="footer" />  </body>  </html> </xsl:template> </xsl:stylesheet> 「note.xsl」(top.xslにおけるxsl:importをコメントアウトしても結果は変わらなかったため,記載省略。)

    • 締切済み
    • XML
  • XMLの実体参照とXSLT

    次のようなXMLファイルをXSLTで処理したいのですが、&baseの部分がうまく表示できません。 どのようにしたら表示できるでしょうか? ■a.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="a.xsl"?> <!DOCTYPE test [ <!ELEMENT name (#PCDATA)> <!ENTITY base SYSTEM "base.xml"> ]> <test> <name>abc</name> &base; </test> ■base.xml <?xml version="1.0" encoding="UTF-8"?> <base>base</base> ■a.xsl <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" /> <xsl:template match="/"> <xsl:apply-templates select="test" /> <xsl:apply-templates select="base" /> </xsl:template> <xsl:template match="test"> name:<xsl:value-of select="name" /> </xsl:template> <xsl:template match="base"> base:<xsl:value-of select="base" /> </xsl:template> </xsl:stylesheet> □結果 name:abc ※base.xmlの内容を表示できない

    • ベストアンサー
    • XML

専門家に質問してみよう