1

XSLTを使用してxmlファイルをxmlに変換する際に問題が発生しました。最初のノードの属性を取得しているように見えますが、名前の付いたノード<attribute>とその属性と値を取得できません。場合によっては、ノードに必要な属性と値を持つ<attribute>名前のノードがあります。<codedvalue>

ファイルの例を次に示します(編集:読みやすくするために空白を追加):

<?xml version='1.0' encoding='UTF-8'?>
<arb:result xmlns:arb="urn::codeservice">
 <arb:document 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="urn::codeservice prod_code.xsd">
  <header>Produced by CodeRows 4.2</header>
   <body>
    <termsystem id="1" begindate="1970-01-01T00:00:01" 
      expirationdate="2099-12-31T23:59:59" 
      lastmodifieddate="2012-10-05T09:52:02.35522" 
      lastmodifiedby="Admin">
     <attribute type="longname" datatype="ST" 
       language="fi">1</attribute>
     <attribute type="status" datatype="ST">1</attribute>
     <attribute type="codetype" datatype="ST">1</attribute>
     <attribute type="relatesto" datatype="ST">BASE</attribute>
     <attribute type="relatestoname" datatype="ST">BASE</attribute>
     <attribute type="hierarchical" datatype="ST">0</attribute>
     <termitementry id="1010110" language="fi" 
      createdate="2007-10-25T15:24:17.0" 
      begindate="2003-01-01T00:00:01.0" 
      expirationdate="2004-12-31T23:59:59.0" 
      lastmodifieddate="2007-10-25T17:06:25.0" 
      lastmodifiedby="Admin">
     <attribute type="status" datatype="ST">1</attribute>
     <attribute type="shortname" datatype="ST" language="fi">Whey protein</attribute>
     <attribute type="longname" datatype="ST" language="fi" />
     <attribute type="abbreviation" datatype="ST" 
       language="fi">Raspberry</attribute>
     <attribute type="hierarchylevel" datatype="ST">0</attribute>
     <attribute type="parentid" datatype="ST" language="fi" />
     <attribute type="description" datatype="ST" language="fi" />
     <attribute type="owner" datatype="ST" 
       language="sv">Admin</attribute>
     <attribute type="externallink" 
      datatype="CV" 
      begindate="2003-01-01T00:00:01.0" 
      expirationdate="2005-12-31T23:59:59.0"
      ><codedvalue code="08" 
          codesystem="PUN" 
          codesystemversion="1" 
          referenceid="BASEpowder" /></attribute>
     <attribute type="externallink" 
       datatype="CV" 
       begindate="2001-01-01T00:00:01.0" 
       expirationdate="2006-12-31T23:59:59.0"
       ><codedvalue code="80112" 
          codesystem="PROTEIN" 
          codesystemversion="1" 
          referenceid="BASEprotein" /></attribute>
     <attribute type="externallink" 
       datatype="CV" 
       begindate="2003-01-01T00:00:01.0" 
       expirationdate="2008-01-31T23:59:59.0"
       ><codedvalue code="03" 
          codesystem="REF" 
          codesystemversion="1" 
          referenceid="BASEref" /></attribute>
</termitementry
></termsystem
></body
></arb:document
></arb:result>

私が使用している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="termitementry">
        <xsl:element name="CodeRow">
        
            <xsl:element name="Code">
                <xsl:apply-templates select="@id" />
            </xsl:element>
            
            <xsl:element name="Begindate">
                <xsl:apply-templates select="@begindate" />
            </xsl:element>
            
            <xsl:element name="Expirationdate">
                    <xsl:apply-templates select="@expirationdate" />
            </xsl:element>
            
            <xsl:element name="Lastmodifiedby">
                    <xsl:apply-templates select="@lastmodifiedby" />
            </xsl:element>
            
            
        </xsl:element> 
    </xsl:template> 
    
    <xsl:template match="@id">
        <xsl:value-of select="." />
    </xsl:template>
    
    <xsl:template match="@begindate">
        <xsl:value-of select="." />
    </xsl:template>

    <xsl:template match="@expirationdate">
        <xsl:value-of select="." />
    </xsl:template> 
    
    <xsl:template match="@lastmodifiedby">
        <xsl:value-of select="." />
    </xsl:template>
    
</xsl:stylesheet>

これにより、最初のノードの属性のみを取得しているように見えます<termitementry>が、それ以降は何も取得していません。+それ以降は、http://chris.photobooks.com/xml/default.htmを使用してテストしています。

<transformiix:result>
    Produced by CodeRows 4.2
    
    
    1
    1
    1
    BASE
    BASE
    0
    <CodeRow>
        <Code>
            1010110
        </Code>
        <Begindate>
            2003-01-01T00:00:01.0
        </Begindate>
        <Expirationdate>
            2004-12-31T23:59:59.0
        </Expirationdate>
        <Lastmodifiedby>
            Admin
        </Lastmodifiedby>
    </CodeRow>
</transformiix:result>

誰かが残りを取り除く方法を助けることができますか?

基本構造が次のxmlを取得したい:

<coderow>
     <Code>
          1010110
     </Code>
    <Begindate>
        2003-01-01 (only want the 10 first digits of 2003-01-01T00:00:01.0, preferably I would just to have the digits so it looks like 20030101)
    </Begindate>
    <Shortname>
        Whey protein
    </Shortname>
    <BASEpowder>
        08
    <BASEpowder>
    <BASEprotein>
        80112
    </BASEprotein>

</CodeRow>

そして、どうして「CodeRows 4.2などで作成された」というテンプレートを作成したことがわからないのですか?

4

1 に答える 1

2

CodeRows 4.2 などで作成された」という質問に答えると、テンプレートを作成したことがわかりません。その答えは、他の要素、XSLT のテンプレートを作成していないためです。デフォルトのテンプレート マッチを使用します。このデフォルトの動作は、すべてのノードの子ノードを処理するか、ケース ノードまたはテキスト ノードの場合は、これらをテキストとして出力します。

XSLT は、最上位のドキュメント要素に一致するテンプレートを探すことから始めます。テンプレートの一致を指定していないため、デフォルトの動作が開始されます。最初にテンプレートがtermitementryに一致し、これが見つかるまでに次のようになります。すべての親要素に対してデフォルトの一致が既に実行されています。

これを停止し、termitemtentryノードに直接ジャンプするには、次のようにする必要があります。

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

また、属性を要素に変換する既存のコードを簡略化できることに注意してください。これを行う代わりに

<xsl:element name="Code">
    <xsl:apply-templates select="@id" />
</xsl:element>

あなたはこれを行うことができます

<Code>
   <xsl:value-of select="@id"/>
</Code>

これは、すべての属性に一致するテンプレートを削除できることを意味します。

おそらく、「外部」リンク要素のテンプレート一致のみが必要であり、このようなことができます

<xsl:template match="attribute[@type='externallink']">
   <xsl:element name="{codedvalue/@referenceid}">
      <xsl:value-of select="codedvalue/@code"/>
   </xsl:element>
</xsl:template>

ここに完全な XSLT があります

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

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

   <xsl:template match="termitementry">
      <CodeRow>
         <Code>
            <xsl:value-of select="@id"/>
         </Code>
         <Begindate>
            <xsl:value-of select="@begindate"/>
         </Begindate>
         <Expirationdate>
            <xsl:value-of select="@expirationdate"/>
         </Expirationdate>
         <Lastmodifiedby>
            <xsl:value-of select="@lastmodifiedby"/>
         </Lastmodifiedby>
         <xsl:apply-templates select="attribute[@type='externallink']"/>
      </CodeRow>
   </xsl:template>

   <xsl:template match="attribute[@type='externallink']">
      <xsl:element name="{codedvalue/@referenceid}">
         <xsl:value-of select="codedvalue/@code"/>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

サンプル XML に適用すると、次のように出力されます。

<CodeRow>
   <Code>1010110</Code>
   <Begindate>2003-01-01T00:00:01.0</Begindate>
   <Expirationdate>2004-12-31T23:59:59.0</Expirationdate>
   <Lastmodifiedby>Admin</Lastmodifiedby>
   <BASEpowder>08</BASEpowder>
   <BASEprotein>80112</BASEprotein>
   <BASEref>03</BASEref>
</CodeRow>
于 2012-10-26T08:11:04.607 に答える