Создать ссылку, сравнив два значения - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь разбить проблему на самый простой пример, надеюсь, вы понимаете.Итак, XML выглядит следующим образом:

<!-- FruitsID12345 is the id I want -->
<Fruits id="system://data/Fruits/FruitsID12345/?language=en-GB" majorVersion="1">
    <Header> A header - not important </Header>
    <!-- interesting is 'Strawberry' and the 'id' behind it -->
    <Strawberry id="system://data/Strawberry/StrawberryID12345/?language=en-GB" version="2">
        <Description> Some text - not important </Description>
        <Content> Can be filled with content </Content>
    <Strawberry>
</Fruits>

<!-- There can be more Stawberries just with other IDs -->
<MuchMoreFruits>.....</MuchMoreFruits>

<Lemon>
    <!-- 'targetid' and 'href' are the same -->
    <Text> Click the following link:
        <Link targetid="system://data/Strawberry/StrawberryID12345/" 
              version="2" href="system://data/Strawberry/StrawberryID12345/">Click me 
        </Link>
    </Text>
</Lemon>

Что мне нужно:

{id from Fruits} {major-version from Fruits} {object-type from Fruits} {component-information}

Информация о компонентах следующая:

{id from Strawberry} {version from Strawberry} {object-type from Strawberry}

Таким образом, решение должно выглядетьвот так:

<a href="" my.id="FruitsID12345" my.majorVersion="1" my.type="Fruits" 
   my.component="StrawberryID12345_2_Strawberry">Click me</a>

Я уже сделал составную часть, которая выглядит примерно так:

<xsl:template match="Link">
    <a>
        <!-- think I can put that part in <a> -->
        <xsl:attribute name="href"/>
        <xsl:attribute name="my.component>
            <!-- template to get the id -->
            <!-- substring-before(substring-after(substring-after(., 'data/'), '/'), '/') -->
            <xsl:apply-templates select="@targetid"/>
            <xsl:text>_</xsl:text>
            <xsl:value-of select="@version"/>
            <xsl:text>_</xsl:text>
            <!-- template to get the object-type -->
            <!-- substring-before(substring-after(@targetid, 'data/'), '/') -->
            <xsl:call-template name="objecttype"/>
        </xsl:attribute>
    </a>

Так чего не хватает?

Информация от .Каким-то образом мне нужно сравнить 'StrawberryID' в с StrawberryID, который находится внутри .

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете определить ключ, я не уверен, насколько переменными могут быть имена элементов, ниже я определил его для любого элемента внука корневого элемента, где родительский и дочерний элементы имеют атрибут id, и с помощьюXSLT 1 тогда это нечитаемый беспорядок вложенных substring-before/substring-after вызовов для извлечения материала:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:key name="fruit-ref" match="/*/*[@id]/*[@id]" use="substring-before(@id, '?')"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Text/Link[@href]">
      <xsl:variable name="referenced-fruit" select="key('fruit-ref', @href)"/>
      <xsl:variable name="parent-fruit" select="$referenced-fruit/.."/>
      <a href="" my.id="{substring-before(substring-after(substring-after(substring-after(substring-after($parent-fruit/@id, '/'), '/'), '/'), '/'), '/')}"
                 my.majorVersion="{$parent-fruit/@majorVersion}"
                 my.type="{local-name($parent-fruit)}"
                 my.component="{substring-before(substring-after(substring-after(substring-after(substring-after($referenced-fruit/@id, '/'), '/'), '/'), '/'), '/')}_{$referenced-fruit/@version}_{local-name($referenced-fruit)}">Click me</a>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / bdxtqK дает желаемый результат <a href="" my.id="FruitsID12345" my.majorVersion="1" my.type="Fruits" my.component="StrawberryID12345_2_Strawberry">Click me</a>, поэтомуНадеюсь, это поможет.Я не уверен, является ли используемое ключевое выражение use="substring-before(@id, '?') достаточно точным, но, разумеется, его также можно превратить в более конкретные (и менее читаемые) вложенные строковые функции, вызывающие беспорядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...