元素

时间:2016-05-03 09:01:54

标签: xml xslt

我是xlst的初学者。我有这个xslt代码:

<xsl:for-each select="marc:datafield[@tag=100]">
  <origination>
    <persname encodinganalog="100" role="creator">
      <xsl:if test="marc:subfield[@code='a']">
        <xsl:value-of select="marc:subfield[@code='a']" /></xsl:if>
      <xsl:if test="marc:subfield[@code='D']">,
        <xsl:value-of select="marc:subfield[@code='D']" /></xsl:if>
      <xsl:if test="marc:subfield[@code='b']">,
        <xsl:value-of select="marc:subfield[@code='b']" /></xsl:if>
      <xsl:if test="marc:subfield[@code='c']">,
        <xsl:value-of select="marc:subfield[@code='c']" /></xsl:if>
    </persname>
  </origination>
</xsl:for-each>

我想更新属性&#34; @ encodinganalog&#34; &#34; persname&#34;如果转换后的source-xml有一个特定的子字段。 例如。如果以下表达式为真:

<xsl:if test="marc:subfield[@code='a']"></xsl:if>

我想&#34;编码模拟&#34;成为&#34; 100 $ a&#34;

如果以下所有表达式都为真:

<xsl:if test="marc:subfield[@code='a']">
  <xsl:value-of select="marc:subfield[@code='a']" /></xsl:if>
<xsl:if test="marc:subfield[@code='D']">,
  <xsl:value-of select="marc:subfield[@code='D']" /></xsl:if>
<xsl:if test="marc:subfield[@code='b']">,
  <xsl:value-of select="marc:subfield[@code='b']" /></xsl:if>
<xsl:if test="marc:subfield[@code='c']">,
  <xsl:value-of select="marc:subfield[@code='c']" /></xsl:if>

&#34; encodinganalog&#34;的价值应该是&#34; 100 $ a $ D $ b $ c&#34;

怎么可能这样做?

1 个答案:

答案 0 :(得分:0)

您可以使用xsl:attribute将动态属性添加到输出XML

<origination>
  <persname role="creator">
    <xsl:attribute name="encodinganalog">
      <xsl:text>100</xsl:text>
      <xsl:if test="marc:subfield[@code='a']">
        <xsl:text>$a</xsl:text>
      </xsl:if>
      <xsl:if test="marc:subfield[@code='D']">
        <xsl:text>$D</xsl:text>
      </xsl:if>
      <xsl:if test="marc:subfield[@code='b']">,
        <xsl:text>$b</xsl:text>
      </xsl:if>
      <xsl:if test="marc:subfield[@code='c']">
        <xsl:text>$c</xsl:text>
      </xsl:if>
    </xsl:attribute>
  </persname>
</origination>

请注意,这里有一些代码重复,因此您可以使用模板

进行一些简化
<origination>
  <persname role="creator">
    <xsl:attribute name="encodinganalog">
      <xsl:text>100</xsl:text>
      <xsl:apply-templates select="marc:subfield[@code='a']" />
      <xsl:apply-templates select="marc:subfield[@code='D']" />
      <xsl:apply-templates select="marc:subfield[@code='b']" />
      <xsl:apply-templates select="marc:subfield[@code='c']" />
    </xsl:attribute>
  </persname>
</origination>

然后像这样有一个模板匹配

 <xsl:template match="marc:subfield">
     <xsl:text>$</xsl:text>
     <xsl:value-of select="@code" />          
 </xsl:template>