0

我基本上是在寻找与此相反的

我正在处理的 XML 示例:

<profiledesc>
   <creation>
       Finding Aid encoded by Some Guy, <date normal="2011-09-21">21 September 2011</date>
   </creation>
   <langusage encodinganalog="546">
      Finding aid written in
      <language langcode="eng" scriptcode="latn" encodinganalog="041">
         English   
      </language>
   </langusage>
</profiledesc>

我正在编写的 XSLT 示例(仅相关部分):

<xsl:template priority="3" match="descgrp|eadheader|filedesc|titlestmt|profiledesc|archdesc|langusage|did">
   <xsl:apply-templates select="./child::node()"/>
</xsl:template>

<xsl:template priority="2" match="language">
   <atom name="EADLanguageOfFindingAid" type="text" size="short">
      <xsl:value-of select="."/>
   </atom>
   <atom name="EADLanguageCodeOfFindingAid" type="text" size="short">
       <xsl:value-of select="normalize-space(@langcode)"/>
   </atom>
</xsl:template>

... Other templates, for nodes like 'creation' ....

我得到的(坏)输出的一个例子:

... Some other tags ...
<atom name="EADCreation" type="text" size="short">Finding Aid encoded by Some Guy, 21 September 2011</atom>
Finding aid written in
<atom name="EADLanguageOfFindingAid" type="text" size="short"> English </atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom>
... Some other tags ...

我想要的(好)输出的一个例子:

... Some other tags ...
<atom name="EADCreation" type="text" size="short">Finding Aid encoded by Some Guy, 21 September 2011</atom>
<atom name="EADLanguageOfFindingAid" type="text" size="short"> English </atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom>
... Some other tags ...

请注意,在第二个输出中,缺少“Finding aid written in”这一行

因此,如您所见,我设计的模板只输出语言”标签的“语言”部分,但输出的是整个标签,包括“书写的查找帮助”文本节点。我不能确定文本节点是否存在或者它将是第一个(或最后一个,或在任何特定位置)。我也不能确定只有一个文本节点或一个子节点。所以,我不能使用任何依赖于简单地选择“[xth]”节点(子节点或文本)的解决方案。

在这一点上,我很感激任何建议,甚至是一些可以帮助我通过 Google 找到解决方案的关键字(到目前为止我还没有运气)。

4

1 回答 1

1

听起来您只想选择子元素langusage不是所有子节点(任何类型,这是node()选择的内容(不包括属性节点和根节点))。

例如,这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="langusage">
        <xsl:apply-templates select="*"/>
    </xsl:template>
    <xsl:template match="language">
        <atom name="EADLanguageOfFindingAid" type="text" size="short">
            <xsl:value-of select="normalize-space()"/>
        </atom>
        <atom name="EADLanguageCodeOfFindingAid" type="text" size="short">
            <xsl:value-of select="normalize-space(@langcode)"/>
        </atom>
    </xsl:template>
</xsl:stylesheet>

应用于这个简化的输入:

<profiledesc>
   <langusage encodinganalog="546">
      Finding aid written in
      <language langcode="eng" scriptcode="latn" encodinganalog="041">
         English   
      </language>
      <language langcode="esp" scriptcode="latn" encodinganalog="042">
         Spanish   
      </language>
   </langusage>
</profiledesc>

产生以下输出:

<atom name="EADLanguageOfFindingAid" type="text" size="short">English</atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom>
<atom name="EADLanguageOfFindingAid" type="text" size="short">Spanish</atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">esp</atom>

不需要的文本 -查找帮助写入- 不会出现在输出中。

请注意,*在:

<xsl:apply-templates select="*"/>

...只是一种较短的说法child::*。两者都选择当前节点的所有子元素。

于 2012-07-11T05:37:40.387 回答