所以我想找到与sex属性匹配的id属性,其值为" m"或" f"然后使用该ID从另一个元素中选择文本,我不想在性别=" u"
时选择文本。提前感谢!
这里是示例xml:
<header>
<personDesc>
<person id="1234" sex="m"></person>
<person id="3456" sex="f"></person>
<person id="7890" sex="u"></person>
</personDesc>
</header>
<stext>
<u who="1234">
<s>
<w>Stuff I want</w>
<w>to select</w>
</s>
</u>
<u who="3456">
<s>
<w>Stuff I want</w>
<w>to select</w>
</s>
</u>
<u who="7890">
<s>
<w>stuff i don’t want</w>
<w>to select</w>
</s>
</u>
</stext>
我正在尝试破解现有的脚本,但我只获得第一个w元素:
<xsl:key name="uTab" match="u" use="@who"/>
<xsl:template match="/">
<xsl:apply-templates select="//stext" />
</xsl:template>
<xsl:template match="stext">
<xsl:for-each select=“../Header/particDesc/person">
<xsl:variable name="who">
<xsl:value-of select="id"/>
</xsl:variable>
<td><xsl:value-of select="key('uTab',$who)//w"/></td>
</xsl:for-each>
</xsl:template>
我希望输出显示性别=&#34; m&#34;或性别=&#34; f&#34;:
id 1234 stuff i want to select
id 3456 stuff i want to select
希望这是有道理的!
答案 0 :(得分:0)
根据定义,value-of
节点集(在XSLT 1.0中)是文档顺序中集合中第一个节点的值。 key
函数 选择所有匹配的元素,但value-of
会抛出大部分元素。
您需要处理key('uTab',$who)//w
为您提供的所有节点(使用for-each
或apply-templates
)并依次输出每个节点的值。
答案 1 :(得分:0)
使XML有效后,它可能如下所示:
<xml>
<header>
<personDesc>
<person id="1234" sex="m" />
<person id="3456" sex="f" />
<person id="7890" sex="u" />
</personDesc>
</header>
<stext>
<u who="1234">
<s>
<w>Stuff I want</w>
<w>to select</w>
</s>
</u>
<u who="3456">
<s>
<w>Stuff I want</w>
<w>to select</w>
</s>
</u>
<u who="7890">
<s>
<w>stuff i don’t want</w>
<w>to select</w>
</s>
</u>
</stext>
</xml>
您可能希望在XSL转换中使用的XPath是
/xml/stext/u[@who=/xml/header/personDesc/person[@sex!='u']/@id]/s
这意味着:
/xml/stext/u/s
u/@who
属性设置为... person/@id
属性...... @sex
属性不等于u
转型可能如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xml:space="default" exclude-result-prefixes="" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="no" indent="yes" />
<xsl:template match="/xml/stext/u[@who=/xml/header/personDesc/person[@sex!='u']/@id]">
id <xsl:value-of select="@who" /> <xsl:for-each select=".//text()"><xsl:value-of select="." /> </xsl:for-each></xsl:template>
<xsl:template match="text()">
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
我已为此编写脚本。看看,这会对你有所帮助。我刚刚在你的xml之前和之后添加了你可以删除它。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:for-each select="xml/header/personDesc/*">
<xsl:if test="@sex!='u'">
<xsl:variable name="selectedId" select="@id"/>
<xsl:for-each select="/xml/stext/*">
<xsl:if test="$selectedId=@who">
<xsl:for-each select="s/w">
<xsl:element name="id">
<xsl:value-of select="$selectedId"/>
</xsl:element>
<xsl:element name="w">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出是:
<?xml version="1.0" encoding="UTF-8"?>
<transformiix:result xmlns:transformiix="http://www.mozilla.org/TransforMiix">
<id>1234</id>
<w>Stuff I want</w>
<id>1234</id>
<w>to select</w>
<id>3456</id>
<w>Stuff I want</w>
<id>3456</id>
<w>to select</w>
</transformiix:result>
如果有帮助并且有效,请加以标记。
谢谢,
拉夫