1

xsltを使用して次のことを達成する方法を誰かが提案できますか?

これはxml入力です:

<output>
    <header>
       <someId>ABC123</someId>
 </header>
 <results>
  <product id="A">
   <externalId>XYZ666</externalId>
   <title>some title a</title>
  </product>
  <product id="B">
   <externalId>ABC123</externalId>
   <title>some title b</title>
  </product>
  <product id="C">
   <externalId>666777</externalId>
   <title>some title c</title>
  </product>
 </results>
</output>

私が必要としているのは、\product\externalId が存在する \header\someId に一致する「product」のみを返す xslt です。それ以外の場合は、すべての \product 要素に一致します。

どんな提案でも大歓迎です。

4

4 に答える 4

1

を使用する必要があります<xsl:when test="condition">

XMLについては、条件付きでノードを選択するためのサンプルXSLTコードを提供しました。

<?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" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="results/product">
    <xsl:choose>
      <xsl:when test="externalId = /output/header/someId">
        <!--Here goes the code-->
        <something></something>
      </xsl:when>
      <xsl:otherwise>
        <!--Other code -->
        <somethingelse></somethingelse>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

上記のコードは..のように動作します。

if ("externalId = /output/header/someId") then
        <!--Here goes the code-->
        <something></something>
else
        <!--Other code -->
        <somethingelse></somethingelse>

アイデンティティテンプレートオーバーライドを使用する!

<?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" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="results/product[externalId = /output/header/someId]">
    <!--Here goes the code-->
    <something></something>
  </xsl:template>
  <xsl:template match="results/product[externalId != /output/header/someId]">
    <!--Here goes the code-->
    <somethingelse></somethingelse>
  </xsl:template>
</xsl:stylesheet>
于 2012-12-03T12:56:41.610 に答える
1

これと同じくらい簡単です -- 変数なし、 no xsl:chose、 no xsl:when、 noxsl:otherwise :

<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:template match="/">
     <xsl:copy-of select=
     "/*[header/someId]/results/product[externalId=/*/header/someId]
     |
      /*[not(header/someId)]/results/product
     "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<output>
    <header>
       <someId>ABC123</someId>
 </header>
 <results>
  <product id="A">
   <externalId>XYZ666</externalId>
   <title>some title a</title>
  </product>
  <product id="B">
   <externalId>ABC123</externalId>
   <title>some title b</title>
  </product>
  <product id="C">
   <externalId>666777</externalId>
   <title>some title c</title>
  </product>
 </results>
</output>

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

<product id="B">
   <externalId>ABC123</externalId>
   <title>some title b</title>
</product>

この XML ドキュメントに同じ変換を適用すると、次のようになります。

<output>
 <results>
  <product id="A">
   <externalId>XYZ666</externalId>
   <title>some title a</title>
  </product>
  <product id="B">
   <externalId>ABC123</externalId>
   <title>some title b</title>
  </product>
  <product id="C">
   <externalId>666777</externalId>
   <title>some title c</title>
  </product>
 </results>
</output>

ここでも、必要な正しい結果が生成されます。

<product id="A">
   <externalId>XYZ666</externalId>
   <title>some title a</title>
</product>
<product id="B">
   <externalId>ABC123</externalId>
   <title>some title b</title>
</product>
<product id="C">
   <externalId>666777</externalId>
   <title>some title c</title>
</product>

説明:

Exp1特定の条件が である場合に 1 つのノード セットを (式 によって)someCondition選択し、同じ条件が である場合にtrue()別のノード セットを (式 によって)選択する一般的な方法を使用します。Exp2false()

結合された 2 つの式は、相互に排他的な 2 つの条件の下でノードを選択できます。したがって、条件の値に応じて、一方の式だけがノードを選択できます。

 Exp1[someCondition] |  Exp2[not(someCondition)]
于 2012-12-03T12:58:49.003 に答える
0

w3schools のチュートリアルは良い出発点です。

このページを参考にしてみてください!

于 2012-12-03T11:35:01.417 に答える
0
<xsl:key name="by-id" match="product" use="externalId"/>

<xsl:template match="/">
  <xsl:variable name="ref" select="key('by-id', //header/someId)"/>
  <xsl:choose>
    <xsl:when test="$ref">
      <xsl:copy-of select="$ref"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="//product"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

キーを使用してノードを相互参照する方法を示します。

于 2012-12-03T11:36:10.513 に答える