2012-07-10 151 views
0

基本上,我在寻找的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我的例子“M书面方式(只有相关部分):

<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”标签的“语言”部分,但是整个标签,包括“Finding aid in written”文本节点,正在输出代替。我不能确定文本节点是否存在,或者它将是第一个(或最后一个,还是在任何特定位置)。我也不能确定只有一个文本节点或一个子节点。所以,我不能使用依赖于简单地选择“[第x个]”节点(子节点或文本)的任何解决方案。

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

+1

您需要准确显示您想要的输出。对我来说并不清楚,并且您不会通过询问输出如'Finding Aid encoded by ...'(使用省略号)而实际上不出现在您的原始文档中。我应该如何知道你认为应该出现在“......”的位置?我无法读懂你的想法。 – 2012-07-10 19:14:17

+0

@lwburk - 谢谢你让我知道你发现的问题不清楚。我填写了更多的示例输出。更好的是,我在示例下方以粗体文本的方式添加了一行以明确我要找的内容。我希望有所帮助。 – aarondev 2012-07-10 19:57:29

+0

我还没有*完全*确定我明白,但我想你想要的只是选择*元素*的孩子。我会为此添加一个答案,希望它对一些人有所帮助。 – 2012-07-11 05:16:12

回答

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::*较短的方式。都选择当前节点的所有元素子元素。

+0

谢谢!我正要修改这个问题,因为我发现将'child :: node()'改为'./*'解决了这个问题。现在我很好奇为什么。似乎'node()'选择所有节点,甚至文本节点,而'*'只选择元素子节点。正确? – aarondev 2012-07-11 13:40:10

+0

@aarondev - 是的。 'node()'选择除属性和根节点之外的任何节点类型,而'*'只选择元素。 – 2012-07-11 14:23:50

+0

更一般地说:*主节点类型的任何节点的节点测试*均为真。例如,child :: *将选择上下文节点的所有元素子元素,而attribute :: *将选择上下文节点的所有属性。* http://www.w3.org/TR/xpath/#node-tests – 2012-07-11 14:29:45

相关问题