2

私の現在のXMLは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<Rowsets DateCreated="2012-07-17T11:57:07" EndDate="2012-07-17T11:57:07" StartDate="2012-07-17T10:57:07" Version="12.0.12 Build(9)">
    <Rowset>
        <Row>
            <CategoryID>1</CategoryID>
            <Name>Philip</Name>
            <City>London</City>
            <Phone>123</Phone>
        </Row>
        <Row>
            <CategoryID>2</CategoryID>
            <Name>Derek</Name>
            <City>Seattle</City>
            <Phone>500</Phone>
        </Row>
        <Row>
            <CategoryID>3</CategoryID>
            <Name>Bruke</Name>
            <City>LosAngeles</City>
            <Phone>600</Phone>
        </Row>
        <Row>
            <CategoryID>2</CategoryID>
            <Name>Yang</Name>
            <City>SFO</City>
            <Phone>1233</Phone>
        </Row>
        <Row>
            <CategoryID>3</CategoryID>
            <Name>Cristina</Name>
            <City>SanJose</City>
            <Phone>890</Phone>
        </Row>
        <Row>
            <CategoryID>4</CategoryID>
            <Name>Meredith</Name>
            <City>Sunnyvale</City>
            <Phone>788</Phone>
        </Row>
        <Row>
            <CategoryID>4</CategoryID>
            <Name>Grey</Name>
            <City>MountainView</City>
            <Phone>456</Phone>
        </Row>
        <Row>
            <CategoryID>5</CategoryID>
            <Name>Torrence</Name>
            <City>SAntaClara</City>
            <Phone>432</Phone>
        </Row>
    </Rowset>
</Rowsets>

今、私は 2 のものだけが欲しい<Row>ので<CategoryID>、私の XSLT は次のとおりです:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:java="http://xml.apache.org/xslt/java" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="java" version="1.0">
    <xsl:output media-type="text/xml" method="xml"/>
    <!-- Filters refdoc based on condition and  data  -->
    <xsl:template match="/">
        <Rowsets>
            <xsl:for-each select="/Rowsets/Rowset">
                <Rowset>
                    <xsl:copy-of select="Columns"/>
                    <xsl:for-each select="Row[CategoryID = '2']">
                        <xsl:copy-of select="."/>
                    </xsl:for-each>
                </Rowset>
            </xsl:for-each>
        </Rowsets>
    </xsl:template>
</xsl:stylesheet>

この XSLT により、次の XML が得られます。

<?xml version="1.0" encoding="utf-8"?>
<Rowsets>
    <Rowset>
        <Row>
            <CategoryID>2</CategoryID>
            <Name>Derek</Name>
            <City>Seattle</City>
            <Phone>500</Phone>
        </Row>
        <Row>
            <CategoryID>2</CategoryID>
            <Name>Yang</Name>
            <City>SFO</City>
            <Phone>1233</Phone>
        </Row>
    </Rowset>
</Rowsets>

しかし、私の要件は、上記の新しい変換された XML で、CategoryID も 1 に変更することです。

SO 私の最終的な XML は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<Rowsets>
    <Rowset>
        <Row>
            <CategoryID>1</CategoryID>
            <Name>Derek</Name>
            <City>Seattle</City>
            <Phone>500</Phone>
        </Row>
        <Row>
            <CategoryID>1</CategoryID>
            <Name>Yang</Name>
            <City>SFO</City>
            <Phone>1233</Phone>
        </Row>
    </Rowset>
</Rowsets>

同じ XSLT を使用して最適な方法でこれを実現する方法がわかりません。誰でも私を助けることができますか?

4

2 に答える 2

2

この変換:

<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="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="Row[not(CategoryID = 2)]"/>

 <xsl:template match="CategoryID/text()">1</xsl:template>
</xsl:stylesheet>

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

<Rowsets DateCreated="2012-07-17T11:57:07" EndDate="2012-07-17T11:57:07" StartDate="2012-07-17T10:57:07" Version="12.0.12 Build(9)">
    <Rowset>
        <Row>
            <CategoryID>1</CategoryID>
            <Name>Philip</Name>
            <City>London</City>
            <Phone>123</Phone>
        </Row>
        <Row>
            <CategoryID>2</CategoryID>
            <Name>Derek</Name>
            <City>Seattle</City>
            <Phone>500</Phone>
        </Row>
        <Row>
            <CategoryID>3</CategoryID>
            <Name>Bruke</Name>
            <City>LosAngeles</City>
            <Phone>600</Phone>
        </Row>
        <Row>
            <CategoryID>2</CategoryID>
            <Name>Yang</Name>
            <City>SFO</City>
            <Phone>1233</Phone>
        </Row>
        <Row>
            <CategoryID>3</CategoryID>
            <Name>Cristina</Name>
            <City>SanJose</City>
            <Phone>890</Phone>
        </Row>
        <Row>
            <CategoryID>4</CategoryID>
            <Name>Meredith</Name>
            <City>Sunnyvale</City>
            <Phone>788</Phone>
        </Row>
        <Row>
            <CategoryID>4</CategoryID>
            <Name>Grey</Name>
            <City>MountainView</City>
            <Phone>456</Phone>
        </Row>
        <Row>
            <CategoryID>5</CategoryID>
            <Name>Torrence</Name>
            <City>SAntaClara</City>
            <Phone>432</Phone>
        </Row>
    </Rowset>
</Rowsets>

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

<Rowsets DateCreated="2012-07-17T11:57:07" EndDate="2012-07-17T11:57:07" StartDate="2012-07-17T10:57:07" Version="12.0.12 Build(9)">
   <Rowset>
      <Row>
         <CategoryID>1</CategoryID>
         <Name>Derek</Name>
         <City>Seattle</City>
         <Phone>500</Phone>
      </Row>
      <Row>
         <CategoryID>1</CategoryID>
         <Name>Yang</Name>
         <City>SFO</City>
         <Phone>1233</Phone>
      </Row>
   </Rowset>
</Rowsets>

説明:

  1. アイデンティティ ルールの適切な使用とオーバーライド。

  2. テンプレートとパターン マッチングの適切な使用。

于 2012-07-31T01:24:48.633 に答える
0

それが最善の方法かどうかはわかりませんが、これでうまくいくはずです。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:java="http://xml.apache.org/xslt/java" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="java" version="1.0">
  <xsl:output media-type="text/xml" method="xml"/>
  <!-- Filters refdoc based on condition and  data  -->
  <xsl:template match="/">
    <Rowsets>
      <xsl:for-each select="/Rowsets/Rowset">
        <Rowset>
          <xsl:copy-of select="Columns"/>
          <xsl:for-each select="Row[CategoryID = '2']">
            <Row>
              <xsl:apply-templates select="*" mode="Row" />
            </Row>
          </xsl:for-each>
        </Rowset>
      </xsl:for-each>
    </Rowsets>
  </xsl:template>

  <xsl:template match="*" mode="Row">
    <xsl:choose>
      <xsl:when test="current()[name()='CategoryID']">
        <xsl:copy>
          <xsl:text>1</xsl:text>
        </xsl:copy>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="." />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

出力は次のようになります

<?xml version="1.0" encoding="UTF-8"?>
<Rowsets>
  <Rowset>
    <Row>
      <CategoryID>1</CategoryID>
      <Name>Derek</Name>
      <City>Seattle</City>
      <Phone>500</Phone>
    </Row>
    <Row>
      <CategoryID>1</CategoryID>
      <Name>Yang</Name>
      <City>SFO</City>
      <Phone>1233</Phone>
    </Row>
  </Rowset>
</Rowsets>
于 2012-07-31T00:00:07.163 に答える