0

次のxmlファイルがあります。

<generic_etd>
  <dc.contributor>NSERC</dc.contributor>
  <dc.creator>gradstudent</dc.creator>
  <dc.contributor>John Smith</dc.contributor>
  <dc.contributor.role>Advisor</dc.contributor.role>
  <dc.date>2013-05-07</dc.date>
  <dc.format>30 pages</dc.format>
  <dc.format>545709 bytes</dc.format>
  <dc.contributor>Jane Smith</dc.contributor>
  <dc.contributor.role>Committee Member</dc.contributor.role>
</generic_etd>

xslt 1.0を使用して次のように変換したいと思います:

<etd_ms>
  <etd_ms:contributor>NSERC</etd_ms:contributor>
  <etd_ms:creator>gradstudent</etd_ms:creator>
  <etd_ms:contributor role="Advisor">John Smith</etd_ms:contributor>
  <etd_ms:date>2013-05-07</etd_ms:date>
  <etd_ms:format>30 pages</etd_ms:format>
  <etd_ms:format>545709 bytes</etd_ms:format>
  <etd_ms:contributor role="Committee Member">Jane Smith</etd_ms:contributor>
</etd_ms>

etd_ms の置換はできますが、contributor 行の属性として contributor.role 行を挿入するのが困難です。私は xslt 変換が初めてなので、これには困惑しています。助言がありますか?

これまでのコードは次のとおりです (簡潔にするために、開始タグと終了タグは省略しています。また、私が最初に持っていたコードよりもはるかに簡潔なバージョンのコードを提供してくれた Navin Rawat にも感謝したいと思います):

<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

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

</xsl:template>

<xsl:template match="*">
    <xsl:choose>
        <xsl:when test="name()='generic_etd'">
            <etd_ms:thesis>
                <xsl:apply-templates/>
            </etd_ms:thesis>
        </xsl:when>
        <xsl:otherwise>
            <xsl:variable name="newtag" select="concat('etd_ms:',substring-after(name(),'.'))"/>
            <xsl:choose>
                <xsl:when test="contains($newtag, '.')">
                    <xsl:element name="{substring-before($newtag,'.')}">
                        <xsl:apply-templates/>
                    </xsl:element>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:element name="{$newtag}">
                        <xsl:apply-templates/>
                    </xsl:element>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

ありがとう。

4

1 に答える 1

0

私は自分で解決策を見つけることができました。基本的に、元の質問に含めた以前の xslt ファイルから呼び出すテンプレートを作成しました。使用したテンプレートは次のとおりです。

<xsl:template name="contributor-role">
  <xsl:param name="element-tag"/>
  <xsl:choose>
    <!-- check if the next element is a contributer role -->
    <xsl:when test="following-sibling::dc.contributor.role[1]">
      <xsl:element name="{$element-tag}">
        <!-- add the role as an attribute of the current element-->
        <xsl:attribute name="role">
          <xsl:value-of select="following-sibling::dc.contributor.role[1]"/>
        </xsl:attribute>
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <!-- else process the element normally -->
      <xsl:element name="{$element-tag}">
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
于 2013-05-10T18:55:53.813 に答える