XSLT 2.0针对不同情况的一个元素(@mode不起作用)

时间:2013-10-15 13:24:52

标签: xslt xslt-2.0

我完全不熟悉XSLT(Iam使用氧气,XSLT 2.0) 我试图在网上和我的书中找到解决方案,但无法弄明白。

我有以下情况: 我有一个XML(TEI)在段落中有不同的'term'元素。我想用条款做不同的东西,但是@mode它不起作用。 我想给条款一个链接 我想匹配元素'lb /' - &gt; 'lb'在'term'(<term> tex <lb /> t </term>)内的元素'br /' 我想在我的html中使用'del` dissapear,当它在'term'内 4.如果'term'中的分隔符是“ - ”我想插入我的html'br /'

我的XML摘录(文字毫无意义):

<p>und <term>toxische <lb/>
    Quote</term> dabei eine Rolle. – text<term><del>t</del><add rend="overtyped">t</add><del>t</del><add type="overtyped">l</add></term>leicht teilen Sie mir einmal <lb/>
    freundlichst Ihre Ansicht mit.</p> 

for 4.我用过这个:

<xsl:template match="tei:term">

<xsl:variable name="linktext" select="text()"/>
<a href="https://de.wikipedia.org/wiki/{$linktext}" target="_blank"> 
    <xsl:for-each select="tokenize(.,'-')">
        <xsl:sequence select="."/>
        <xsl:if test="not(position() eq last())">-<br /></xsl:if>
    </xsl:for-each> 

  </a>

我尝试使用@modes处理其他情况,但它没有用。 有没有人知道如何编码?

提前致谢!!

我想要的结果是以下html代码:

<p> und <a href="href="https://de.wikipedia.org/wiki/toxischeQuote">toxische<br/>
Quote</a> dabei eine Rolle. - text<a      href="href="https://de.wikipedia.org/wiki/texttl">
texttl</a> leicht teilen Sie mir einmal <br/> freundlichst Ihre Ansicht mit. </p>

我希望'del'的内容消失。

2 个答案:

答案 0 :(得分:1)

  

我想给条款一个链接

这是:

<xsl:template match="tei:term">
  <xsl:variable name="linktext" select="
    normalize-space(string-join(.//text()[not(parent::del)], ''))
  " />  <!-- ... or something like that -->

  <a href="http://de.wikipedia.org/w/index.php?search={encode-for-uri($linktext)}" target="_blank"> 
    <xsl:apply-templates select="node()" />
  </a>
</xsl:template>

  

我想匹配元素<lb/> - &gt; <br/><lb/>

之内时<term>

这是:

<xsl:template match="tei:term/tei:lb">
  <br />
</xsl:template>

  

我希望<del><term>

内的HTML中消失

那是

<xsl:template match="tei:term/tei:del" />

并且,你很可能也想要这个:

<xsl:template match="tei:term/tei:add">
  <xsl:value-of select="." />
</xsl:template>

  

如果<term>内的分隔符为"-",我想在我的html <br/>中插入

这是

<xsl:template match="tei:term/text()">
  <xsl:for-each select="tokenize(., '-')">
    <xsl:sequence select="." />
    <xsl:if test="not(position() = last())">-<br /></xsl:if>
  </xsl:for-each> 
</xsl:template>

请注意

  • 此方法通过<term>按其出现顺序处理<xsl:apply-templates>的子节点。然后,通过特定模板轻松实现规则。
  • 您只想标记单个文本节点,而不是<term>
  • 的整个字符串内容
  • 构建网址时,您应该(即必须)使用encode-for-uri()功能。

答案 1 :(得分:1)

<xsl:template match="tei:term">
  <a href="https://de.wikipedia.org/wiki/{.}" target="_blank">
    <xsl:apply-templates/>
  </a>
</xsl:template>

<xsl:template match="tei:term/tei:lb">
  <br/>
</xsl:template>

<xsl:template match="tei:term/tei:del"/>

<xsl:template match="tei:term//text()">
<xsl:for-each select="tokenize(.,'-')">
        <xsl:sequence select="."/>
        <xsl:if test="not(position() eq last())">-<br /></xsl:if>
    </xsl:for-each>
</xsl:template>