2015-03-16 2 views
1

Я в XML, который выглядит в настоящее время следующим образом:XSL: Поиск элемента, имеющий атрибут равен одному свойства текущего атрибута

<?xml version="1.0" encoding="utf-8" ?> 
<RootConfig> 
    <RandomNode RefId="519263a7-e01e-4cc8-911e-7660dca717bf"> 
    <Id>101010101010</Id> 
    </RandomNode> 

    <Item Value="519263a7-e01e-4cc8-911e-7660dca717bf;bf139890-2f7c-4784-8041-68aa5fe7beb1" Type="SomeUniqueType" /> 
    <Item Value="519263a7-e01e-4cc8-911e-7660dca717bf;5fb8bea0-c79a-4a26-a532-4df59543bc5c" Type="SomeUniqueType" /> 
    <Item Value="519263a7-e01e-4cc8-911e-7660dca717bf;4f01116a-06f8-4af3-9f4a-87c658eb8008" Type="SomeUniqueType" /> 
</RootConfig> 

В каждой позиции, значение ссылается другой узел, и давая данному узлу ссылку.

Я изменить это к концам с файлом, как это:

<?xml version="1.0" encoding="utf-8"?> 
<RootConfig> 
    <RandomNode RefId="519263a7-e01e-4cc8-911e-7660dca717bf"> 
    <Id>101010101010</Id> 
    </RandomNode> 
    <Item Reference="bf139890-2f7c-4784-8041-68aa5fe7beb1" Provider-Id="101010101010" /> 
    <Item Reference="5fb8bea0-c79a-4a26-a532-4df59543bc5c" Provider-Id="101010101010" /> 
    <Item Reference="4f01116a-06f8-4af3-9f4a-87c658eb8008" Provider-Id="101010101010" /> 
</RootConfig> 

В настоящее время, у меня есть следующий XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 


    <xsl:template match="*[@Type='SomeUniqueType']"> 
    <Item> 
     <xsl:call-template name="provided-reference"> 
     <xsl:with-param name="reference" select="@Value"/> 
     </xsl:call-template> 
    </Item> 
    </xsl:template> 

    <xsl:template name="provided-reference"> 
    <xsl:param name="reference"/> 
    <xsl:attribute name="Reference"> 
     <xsl:value-of select="substring-after($reference, ';')"/> 
    </xsl:attribute> 
    <xsl:attribute name="Provider-Id"> 
     <xsl:value-of select="substring-before($reference, ';')"/> 
    </xsl:attribute> 
    </xsl:template> 

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

Но я не могу найти, как это сделать поиск значения, которое я получил от substring-before, а затем получить значение атрибута Id.

Любая идея о том, как это сделать?

ответ

1

Возможно, было бы лучше использовать ключ для этого, особенно если есть много разных RandomNode элементов, которые вы хотите использовать для поиска. Кроме того, нет необходимости в именованных шаблонах или параметрах.

таблицы стилей XSLT

Матч шаблон для Item конечно, может быть изменен на match="*[@Type='SomeUniqueType']", если это действительно необходимо.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:key name="ref-id-to-id" match="RandomNode" use="@RefId"/> 

    <xsl:template match="Item"> 
     <xsl:copy> 
      <xsl:attribute name="Value"> 
       <xsl:value-of select="substring-after(@Value, ';')"/> 
      </xsl:attribute> 
      <xsl:attribute name="Provider-Id"> 
       <xsl:value-of select="key('ref-id-to-id',substring-before(@Value,';'))/Id"/> 
      </xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 


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

</xsl:stylesheet> 

XML Output

<?xml version="1.0" encoding="utf-8"?> 
<RootConfig> 
    <RandomNode RefId="519263a7-e01e-4cc8-911e-7660dca717bf"> 
     <Id>101010101010</Id> 
    </RandomNode> 
    <Item Value="bf139890-2f7c-4784-8041-68aa5fe7beb1" Provider-Id="101010101010"/> 
    <Item Value="5fb8bea0-c79a-4a26-a532-4df59543bc5c" Provider-Id="101010101010"/> 
    <Item Value="4f01116a-06f8-4af3-9f4a-87c658eb8008" Provider-Id="101010101010"/> 
</RootConfig> 

Кстати, на ваш следующий вопрос: Более разумный тест содержал бы Item элементы со ссылками на различных поставщиков, с различными идентификаторами.

+0

Я не знал ссылку 'xsl: key'. После некоторых исследований кажется очевидным, что я должен был попробовать с этим, так как он полностью соответствует моим потребностям, спасибо! Да, я сделал много ярлыков в отношении моего настоящего примера в надежде, что вопрос будет более читабельным и коротким. – J4N

+0

Я закончил с помощью: '' работает как шарм :) – J4N

0

Прошло много времени с тех пор, как я сделал XSLT, но не так ли?

<xsl:value-of select="//RandomNode[@RefId = substring-before($reference, ';')]" /> 

Я думаю, что если вы пытаетесь это сделать, где $ ссылка не входят в комплект, то вы будете иметь проблемы рамочный где. точек в контексте квадратных скобок. В этом случае вам нужно будет:

<xsl:variable name="this" value="." /> 
<xsl:value-of select="//RandomNode[@RefId = substring-before($this/@Value, ';')]" /> 

Предполагая, что ваш контекст будет узлом товара.

Смежные вопросы