从子节点中选择文本并省略文本节点

时间:2012-07-10 18:57:04

标签: xslt xpath xml-parsing

我基本上正在寻找this

的反面

我正在处理的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 ...

请注意,在第二个输出中缺少“查找帮助”行

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

我很欣赏这方面的任何建议,甚至一些关键字可以帮助我通过谷歌找到解决方案(到目前为止我没有运气)。

1 个答案:

答案 0 :(得分: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::*的简短方法。两者都选择当前节点的所有元素子项。