XSLT从一个元素中选择属性并使用它来选择另一个元素中的值

时间:2014-05-15 11:18:58

标签: xml xslt

所以我想找到与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

希望这是有道理的!

3 个答案:

答案 0 :(得分:0)

根据定义,value-of节点集(在XSLT 1.0中)是文档顺序中集合中第一个节点的值。 key函数 选择所有匹配的元素,但value-of会抛出大部分元素。

您需要处理key('uTab',$who)//w为您提供的所有节点(使用for-eachapply-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" />&#160;<xsl:for-each select=".//text()"><xsl:value-of select="." />&#160;</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>

如果有帮助并且有效,请加以标记。

谢谢,
拉夫