1

XSLT 内の XML ファイルを読み取り、そのノードを確認したいと考えています。変換を適用する XML ノードの値と一致する場合は、XML ノードの値を取得し、それを使用して新しい XML 構造を構築します。

これは私の問題を説明するための例です。多くの人がこの質問を参考にして、同様の機能を実現できると思います。

Referenced.xml

<xml>
  <root>
    <Id id = "1">
      <fields>
        <field>
          <name> Name1 </name>
          <value> Val1 </value>
        </field>
        <field>
          <name> Name2 </name>
          <value> Val2 </value>
        </field>
      </fields> 
    </Id>
    <Id id = "2">
    ...
    </Id>
  </root>
</xml>

Xml.xml

<XML>
  <Fields>
   <Id id = "1">
    <F1> Value1 </F1>
    <F2> Value2 </F2>
    <F1> Value3 </F1>
    <F4> Value4 </F4>
 </Id>
  </Fields>
</XML>

ここで、XML ファイル ( ) を反復処理する変換を作成しReferenced.xml、両方の xml 内の ID が一致する場所を確認し、次にその ID 内の場所を確認し、そのName1 = F1場所にある場合は、その「名前」の「値」を取得して作成しますのような XML 構造

<outputXml>
  <Field id="Val1">
    <val> Value1 </val>
  </Field>
  <Field id="Val2">
    <val> Value2 </val>
  </Field> ... and so on
</outputXml>

document()を使用する必要があることはわかっていますReferenced.xmlが、必要な機能を実現するために、内部の xsl をどのように反復処理し、if、else を使用するのかわかりません。

4

3 に答える 3

6

これを確認してください:

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

  <xsl:param name="file1" select="document('Referenced.xml')"/>
  <xsl:param name="file2" select="document('Xml.xml')"/>

  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

  <xsl:template match="/">
    <outputXml>
      <xsl:for-each select="$file1//Id">
        <xsl:variable name="ReferencedID" select="@id"/>
        <xsl:choose>
          <xsl:when test="$ReferencedID = $file2//Id/@id">
            <xsl:for-each select="fields/field">
              <Field id="{normalize-space(value)}"><xsl:value-of select="value"/></Field>
            </xsl:for-each>
          </xsl:when>
        </xsl:choose>
      </xsl:for-each>
    </outputXml>
  </xsl:template>

</xsl:stylesheet>

出力を取得するには:

<outputXml>
   <Field id=" Val1 "> Val1 </Field>
   <Field id=" Val2 "> Val2 </Field>
</outputXml>
于 2013-05-02T06:14:07.410 に答える
3

ここに作業コードの一部があります:

<!-- loads a file like resources/strings-en.xml into a variable document-->
<xsl:variable 
    name="messages" 
    select="document(concat('resources/strings-', $lang, '.xml'))/my:strings"
/>

...

<!-- uses the loaded document for selecting -->
<xsl:template name="localized-string">
    <xsl:param name="name"/>
    <xsl:value-of select="$messages/my:string[@name=$name]"/>
</xsl:template>

ご覧のとおり、ドキュメントを変数に読み込むと、それは通常のドキュメントのように見え、XPath 式を適用してそれをトラバースします。

于 2013-05-01T18:31:06.733 に答える