Я хотел бы переименовать инструкцию обработки и в то же время добавить к ней уникальный атрибут id. Мой вход выглядит следующим образом:Добавить уникальный идентификатор в инструкцию обработки (xsl)
?xml version="1.0" encoding="utf-8" ?>
<material xml:lang="en-us">
<title>
<?PI_start author="joepublic" comment="Comment #1" ?>Discovering
<?PI_end?>XML
</title>
<related-stuff>
<?PI_start author="johndoe" comment="Comment #3" ?>
<a href="otherdoc.xml" />
<?PI_end?>
</related-stuff>
</material>
Результат будет выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<material xml:lang="en-us">
<title>
<?otherPI_start author="joepublic" comment="Comment #1" id ="1" ?>Discovering
<?otherPI_end id ="1" ?>XML
</title>
<related-stuff>
<?otherPI_start author="johndoe" comment="Comment #3" id ="2" ?>
<a href="otherdoc.xml" />
<?otherPI_end id ="2"?>
</related-stuff>
</material>
Обратите внимание, что у меня есть два идентификаторов генерироваться, ID =» 1 "для первой инструкции, встречающейся в документе, id =" 2 "для второй. Также обратите внимание, что идентификатор повторяется в команде обработки otherPI_end.
Можете ли вы помочь мне определить совпадающее утверждение в xsl, которое будет делать это?
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="processing-instruction('PI_start')">
<xsl:processing-instruction name="otherPI_start">
author="<xsl:value-of select="substring-before(substring-after(.,'author="'),'"')"/>"
comment="<xsl:value-of select="substring-before(substring-after(.,'comment="'),'"')"/>"
id="<!-- What should I put here??? -->"
</xsl:processing-instruction>
</xsl:template>
<xsl:template match="processing-instruction('PI_end')">
<xsl:processing-instruction name="otherPI_end">
id="<!-- What should I put there??? -->"
</xsl:processing-instruction>
</xsl:template>
</xsl:stylesheet>
Почему вы говорите: «Это не будет считать текущую инструкцию по обработке»? Я не уверен, что я когда-либо пронумеровал pis раньше, но я не понимаю, почему 'xsl: number' будет вести себя иначе, чем элементы нумерации. И когда я тестирую ваш фрагмент с помощью ' ' с Saxon 6.5.5, число начинается с '1'. –
С http://xsltransform.net/ снова спускаюсь, я был http://www.xslfiddle.net/, который начал нумерацию в 0. Я переформулировал свой ответ, чтобы сделать это более понятным. –
Хм, начиная с нуля, кажется, ошибка в Chrome и libxslt. –