これは、通常のXSLを使って行うことができますか?
はい、XSLT 2.0はXSLT 1.0よりも多くの機能を備えています()。 a general LR(1) parserなどの非常に複雑なテキスト処理がXSLTで実装されており、specific grammars, such as JSONとXPathのパーサーを構築するために使用されています。正規表現(matches()
を使用して許可したものを含めて具体的には、およそunparsed-text()
を学ぶ
、様々なstring functions、tokenize()
とreplace()
)とも<xsl:analyze-string>
命令。
XSLT 1.0には文字列関数(XPath 1.0で提供)もありますが、正規表現の機能/機能がなく、XSLT 2.0関数unparsed-text()
などはありません。最も有用なXPath 1.0の文字列関数の中には:substring()
、substring-after()
、starts-with()
、string-length()
、concat()
substring-before()
、そして特にtranslate()
機能。
Mads Hansenが彼の答えで説明したように、DTD内のエンティティを使ってファイルを "読む"ことができます。もう1つの方法は、変換を開始するプログラム内のファイルを読み取ってから、ファイルのコンテンツを文字列パラメータとして変換に渡すことです。
更新:完全な溶液が可能であるようにOPは現在、特定のデータを提供した:
この変換は、(使用されない)任意のXML文書に適用され <xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vText" select=
"unparsed-text('file:///c:/temp/delete/test.ini')"/>
<xsl:variable name="vLines" as="xs:string*" select=
"tokenize($vText, '
?
')[.]"/>
<xsl:variable name="vLineCnt" select="count($vLines)"/>
<xsl:variable name="vSectLinesInds" as="xs:integer*" select=
"for $i in 1 to $vLineCnt
return
if(starts-with(normalize-space($vLines[$i]), '['))
then $i
else()
"/>
<xsl:variable name="vSectCnt" select="count($vSectLinesInds)"/>
<xsl:template match="/">
<xsl:for-each select="$vSectLinesInds">
<xsl:variable name="vPos" select="position()"/>
<xsl:variable name="vInd" as="xs:integer" select="."/>
<xsl:variable name="vthisLine" as="xs:string"
select="$vLines[$vInd]"/>
<xsl:variable name="vNextSectInd" select=
"if($vPos eq $vSectCnt)
then
$vLineCnt +1
else
$vSectLinesInds[$vPos +1]
"/>
<xsl:variable name="vInnerLines" select=
"$vLines
[position() gt current()
and
position() lt $vNextSectInd
]
"/>
<xsl:variable name="vName" select=
"tokenize($vthisLine, '\[|\]')[2]"/>
<xsl:element name="{$vName}">
<xsl:for-each select="$vInnerLines">
<xsl:variable name="vInnerParts" select=
"tokenize(., '[ ]*=[ ]*')"/>
<xsl:element name="{$vInnerParts[1]}">
<xsl:value-of select="$vInnerParts[2]"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
とファイルであれば
[section1]
option1 = values1
option2 = values2
option3 = values3
option4 = values4
option5 = values5
[section2]
option1 = values1
option2 = values2
option3 = values3
option4 = values4
option5 = values5
[section3]
option1 = values1
option2 = values2
option3 = values3
option4 = values4
option5 = values5
:C:\temp\delete\test.ini
は、以下の内容を持っています必要な正しい結果が得られます。:
<section1>
<option1>values1</option1>
<option2>values2</option2>
<option3>values3</option3>
<option4>values4</option4>
<option5>values5</option5>
</section1>
<section2>
<option1>values1</option1>
<option2>values2</option2>
<option3>values3</option3>
<option4>values4</option4>
<option5>values5</option5>
</section2>
<section3>
<option1>values1</option1>
<option2>values2</option2>
<option3>values3</option3>
<option4>values4</option4>
<option5>values5</option5>
</section3>
XML/XSLTコードが正しく表示されるように正しくフォーマットしてください。ヒント:コードを選択し、 '{}'アイコンをクリックしてください。 –
実際にiniファイルの特定のサンプルを提供する場合、あなたの質問はもっと注意を引くでしょう - あなたの仕事の一部(問題定義)を未完成にしておらず、あなたの読者に実際のサンプルを構築する負担をかけないでください。 –
私はサンプルを提供しましたが、INIは文字通り簡単です。それらのINIブロックのページ全体。 – TechZilla