我基本上正在寻找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]”节点(子节点或文本节点)的任何解决方案。
我很欣赏这方面的任何建议,甚至一些关键字可以帮助我通过谷歌找到解决方案(到目前为止我没有运气)。
答案 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::*
的简短方法。两者都选择当前节点的所有元素子项。