1

基本的に、これは私が試しているロジックです。

親ノード(ByFirstNameSearchListまたはByLastNameSearchList)の場合:

-すべての子要素の値が空です(value1-4)、%の値を挿入します-子要素の1つまたはいずれかに値がある場合、空の値を持つすべての兄弟をNOVALに置き換えます。

私は次のXMLを持っています:

<GetName>
    <ByLastNameSearchList>
        <Value1/>
        <Value2/>
        <Value3/>
        <Value4/>
        <Value5/>
    </ByLastNameSearchList>
    <ByFirstNameSearchList>
        <Value1>String</Value1>
        <Value2>String</Value2>
        <Value3/>
        <Value4/>
        <Value5/>
    </ByFirstNameSearchList>
  </GetName>

これは私がそれをどのように見せたいかです:

<GetName>
    <ByLastNameSearchList>
        <Value1>%</Value1>
        <Value2>%</Value2>
        <Value3>%</Value3>
        <Value4>%</Value4>
        <Value5>%</Value5>
    </ByLastNameSearchList>
    <ByFirstNameSearchList>
        <Value1>String</Value1>
        <Value2>String</Value2>
        <Value3>NOVAL</Value3>
        <Value4>NOVAL</Value4>
        <Value5>NOVAL</Value5>
    </ByFirstNameSearchList>
</GetName>

私を助けてくれて本当にありがとう。私を信じてください。私は限られたXSLの知識ですべてを試しました。

ありがとう。

4

2 に答える 2

0

このスタイルシート

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

   <xsl:template match="*|@*">
      <xsl:copy>
         <xsl:apply-templates/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="ByFirstNameSearchList/* | ByLastNameSearchList/*">
      <xsl:copy>
         <xsl:choose>
            <xsl:when test="string-length(text()) gt 0">
               <xsl:value-of select="text()"/>
            </xsl:when>
            <xsl:when test="some $Value in ../* satisfies string-length($Value/text()) gt 0">
               <xsl:text>NOVAL</xsl:text>
            </xsl:when>
            <xsl:otherwise>
               <xsl:text>%</xsl:text>
            </xsl:otherwise>
         </xsl:choose>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

必要な出力が生成されます。

アップデート:

このバージョンは、文字列のみを含む空でない要素に依存しないため、やや一般的です。

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

   <xsl:template match="*|@*">
      <xsl:copy>
         <xsl:apply-templates/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="ByFirstNameSearchList/* | ByLastNameSearchList/*">
      <xsl:choose>
         <xsl:when test="string-length(text()) gt 0">
            <xsl:copy-of select="."/>
         </xsl:when>
         <xsl:when test="some $Value in ../* satisfies string-length($Value/text()) gt 0">
            <xsl:copy>
               <xsl:text>NOVAL</xsl:text>
            </xsl:copy>
         </xsl:when>
         <xsl:otherwise>
            <xsl:copy>
               <xsl:text>%</xsl:text>
            </xsl:copy>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>
于 2012-11-24T21:05:08.247 に答える
0

これと同じくらい簡単です(XSLT2.0とXSLT1.0の両方):

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

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/*/*[not(node())]">
  <xsl:copy>NOVAL</xsl:copy>
 </xsl:template>

 <xsl:template match="/*/*[not(*/node())]/*">
    <xsl:copy>%</xsl:copy>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合:

<GetName>
    <ByLastNameSearchList>
        <Value1/>
        <Value2/>
        <Value3/>
        <Value4/>
        <Value5/>
    </ByLastNameSearchList>
    <ByFirstNameSearchList>
        <Value1>String</Value1>
        <Value2>String</Value2>
        <Value3/>
        <Value4/>
        <Value5/>
    </ByFirstNameSearchList>
</GetName>

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

<GetName>
      <ByLastNameSearchList>
            <Value1>%</Value1>
            <Value2>%</Value2>
            <Value3>%</Value3>
            <Value4>%</Value4>
            <Value5>%</Value5>
      </ByLastNameSearchList>
      <ByFirstNameSearchList>
            <Value1>String</Value1>
            <Value2>String</Value2>
            <Value3>NOVAL</Value3>
            <Value4>NOVAL</Value4>
            <Value5>NOVAL</Value5>
      </ByFirstNameSearchList>
</GetName>

説明

  1. IDルールは、実行対象として選択されたすべてのノードを「現状のまま」コピーします。

  2. テンプレートは、最上位要素の孫であり、子を持たない要素のIDテンプレートをオーバーライドします。これにより、要素がコピーされ、文字列値が文字列「NOVAL」のテキストノードの子が生成されます。

  3. IDテンプレートと最初のオーバーライドテンプレートの両方をオーバーライドする2番目のオーバーライドテンプレート:最上位要素の孫であり、親に子ノードを持つ子要素がないすべての要素に一致します。これにより、要素がコピーされ、文字列値が文字列 "%"のテキストノードの子が生成されます。

  1. これは純粋な「プッシュスタイル」の変換です。

  2. 明示的な条件付き命令(no xsl:choose、no xsl:when、no xsl:otherwise)、no xsl:text、さらにはno xsl:apply-templates(IDテンプレートを除く)はありません。

  3. 特別なXPath2.0式(some ... satisfies ...)は不要であるため、使用されません。

  4. string-length()関数は使用されません。

于 2012-11-24T21:28:10.037 に答える