2

私は周りを見回しましたが、私の問題に対する明らかな答えは見当たりません。私は何かを見落としていると確信していますが、何がわかりません。

いくつかの要素名を編集するために、以下の XML に対していくつかの前処理を行いました。前処理の後、単純な恒等変換を行う XSL スタイルシートができました。ただし、前処理ステップを回避して、1 つのスタイルシートですべてを達成する方法があるかどうか疑問に思っています。2 つの XML 入力の主な違いは<subj*><subj>.

要素名の開始値 (または終了値もそうだと思います) をテストする方法はありますか? お時間とご提案をありがとうございました。

次のような XML 入力があります。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <row>
      <issueNumber>1.001</issueNumber>
      <subj1>Cats</subj1>
      <subj2>LOLCats</subj2>
      <subj3>Cheezburgers</subj3>
      <subj4></subj4>
   </row>
   <row>
      <issueNumber>2.001</issueNumber>
      <subj1>Cats</subj1>
      <subj2>LOLCats</subj2>
      <subj3>NOMS</subj3>
      <subj4>Cheezburger</subj4>
   </row>
   <row>
      <issueNumber>3.001</issueNumber>
      <subj1>NOMS</subj1>
      <subj2></subj2>
      <subj3></subj3>
      <subj4></subj4>
   </row>
</root>

次の XSL で処理しています。

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

<xsl:template match="/">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="row">
    <!--<xsl:result-document href="{concat(issueNumber, '.xml')}">-->
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    <!--</xsl:result-document>-->    
</xsl:template>

<xsl:template match="issueNumber">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

<xsl:template match="subj">
    <xsl:choose>
        <xsl:when test="not(string(.))"></xsl:when>
        <xsl:when test="string(.)">
            <subject>
                <xsl:apply-templates />
            </subject>
        </xsl:when>
    </xsl:choose>
</xsl:template>

4

2 に答える 2

2

XSLT で「正規表現」のようなものを探していますか? もしそうなら、このリンクはあなたにとって非常に役立つかもしれません: http://www.w3.org/TR/xslt20/#re​​gular-expressions

ただし、このソリューションは XSLT 2.0 でのみ機能します。古い XSLT バージョンとの互換性が失われる可能性があります。

于 2012-04-04T17:41:55.747 に答える
1

質問を正しく理解していれば、次のようなことができます。

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

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

  <xsl:template match="*[starts-with(name(),'subj')]">
    <subj>
      <xsl:if test="string(.)">
        <subject>
          <xsl:apply-templates/>
        </subject>
      </xsl:if>
    </subj>
  </xsl:template>

</xsl:stylesheet>

XML 入力を使用する (整形式になるように修正):

<root>
  <row>
    <issueNumber>1.001</issueNumber>
    <subj1>Cats</subj1>
    <subj2>LOLCats</subj2>
    <subj3>Cheezburgers</subj3>
    <subj4></subj4>
  </row>
  <row>
    <issueNumber>2.001</issueNumber>
    <subj1>Cats</subj1>
    <subj2>LOLCats</subj2>
    <subj3>NOMS</subj3>
    <subj4>Cheezburger</subj4>
  </row>
  <row>
    <issueNumber>3.001</issueNumber>
    <subj1>NOMS</subj1>
    <subj2></subj2>
    <subj3></subj3>
    <subj4></subj4>
  </row>
</root>

次の出力が生成されます。

<root>
   <row>
      <issueNumber>1.001</issueNumber>
      <subj>
         <subject>Cats</subject>
      </subj>
      <subj>
         <subject>LOLCats</subject>
      </subj>
      <subj>
         <subject>Cheezburgers</subject>
      </subj>
      <subj/>
   </row>
   <row>
      <issueNumber>2.001</issueNumber>
      <subj>
         <subject>Cats</subject>
      </subj>
      <subj>
         <subject>LOLCats</subject>
      </subj>
      <subj>
         <subject>NOMS</subject>
      </subj>
      <subj>
         <subject>Cheezburger</subject>
      </subj>
   </row>
   <row>
      <issueNumber>3.001</issueNumber>
      <subj>
         <subject>NOMS</subject>
      </subj>
      <subj/>
      <subj/>
      <subj/>
   </row>
</root>
于 2012-04-04T17:56:44.500 に答える