1

XSLTを使用して解析する必要がある次のXMLがあります。

<PERSONS>
    <PERSON>
        <TYPE>F</TYPE>
        <NAME>ABC</NAME>
    </PERSON>
    <PERSON>
        <TYPE>A</TYPE>
        <NAME>XYA</NAME>
    </PERSON>
    <PERSON>
        <TYPE>S</TYPE>
        <NAME>AFF</NAME>
    </PERSON>
    <PERSON>
        <TYPE>B</TYPE>
        <NAME>HHH</NAME>
    </PERSON>
</PERSONS>

上記の XML では、PERSON タイプは任意の順序で指定でき、次のような出力が必要です。

<SELECTED>
    <NAME>TEXT</NAME>
</SELECTED>

A、F、Sの優先度に基づいて名前を表示する必要があるというルールがあります。

タイプ A が存在しない場合は、タイプ F をチェックし、存在する場合は名前を表示するか、タイプ S の名前を表示します。

また、B や C などの他の型が入力 XML に含まれる可能性もありますが、これらの型を無視する必要があり、優先度は A、F、S のみになります。

前もってありがとう、ウィルソン。

4

3 に答える 3

1

この変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pOrder" select="'AFS'"/>

 <xsl:template match="/*">
  <xsl:for-each select="PERSON[contains($pOrder, TYPE)]">
    <xsl:sort select="string-length(substring-before($pOrder, TYPE))" data-type="number"/>

    <xsl:if test="position() = 1">
            <SELECTED>
                <xsl:copy-of select="NAME"/>
            </SELECTED>
    </xsl:if>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<PERSONS>
    <PERSON>
        <TYPE>F</TYPE>
        <NAME>ABC</NAME>
    </PERSON>
    <PERSON>
        <TYPE>A</TYPE>
        <NAME>XYA</NAME>
    </PERSON>
    <PERSON>
        <TYPE>S</TYPE>
        <NAME>AFF</NAME>
    </PERSON>
    <PERSON>
        <TYPE>B</TYPE>
        <NAME>HHH</NAME>
    </PERSON>
</PERSONS>

必要な正しい結果が生成されます

<SELECTED>
   <NAME>XYA</NAME>
</SELECTED>

$pOrderパラメータが次のように変更された場合:

 <xsl:param name="pOrder" select="'SAF'"/>

再び、必要な正しい結果が生成されます。

<SELECTED>
   <NAME>AFF</NAME>
</SELECTED>

説明:

Type優先順位で並べ替えられた型文字列の開始点までの文字列値の近さによる並べ替えを使用します。

于 2012-06-13T12:36:22.610 に答える
0

あなたの順番はアルファベット順のようですが、あなたがこれを言わなかったので、これは信頼できる期待ではないと思います.

どうですか?

http://www.xmlplayground.com/cMOOBF

実際に IS の順序が確実にアルファベット順である場合、私が持っているように複雑な述語を使用するよりも、最初にノードを並べ替える方がよいでしょう。

于 2012-06-13T08:25:12.837 に答える
0

あなたがアルファベット順にソート可能であると仮定すると、TYPE使用できます

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="PERSONS">
        <xsl:for-each select="PERSON">
            <xsl:sort select="TYPE" order="ascending" />
            <xsl:if test="position() = 1">
                <SELECTED>
                    <NAME>
                        <xsl:value-of select="./NAME" />
                    </NAME>
                </SELECTED>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
于 2012-06-13T08:35:24.237 に答える