Обработка инструкций не требует экранирования чего-либо, они анализируются аналогично комментариям, так как все, что находится между <?
и ?>
, обрабатывается как есть. Если вы можете, вам нужно изменить то, что генерирует эту инструкцию, чтобы сгенерировать это:
<?xm-mark data="<p>Here is the text</p>" ?>
Если вы не можете этого сделать, я бы даже не пытался использовать XSLT для его анализа.
РЕДАКТИРОВАТЬ: я, вероятно, должен уточнить, так как вы, вероятно, делаете вещи более сложными, чем вам нужно здесь: инструкция обработки не имеет атрибутов, и даже "и пробел в конце являются частью значения" 'узла инструкции обработки. Вы получили инструкцию обработки с именем xm-mark
и значением data="<p>Here is the text</p>"
здесь (включая пробел в конце, который здесь не отображается); data
столько же часть значения как <p>..</p>
part.
В вашем случае, вероятно, достаточно <?xm-mark <p>Here is the text</p>?>
, тогда значение узла инструкции обработки равно <p>Here is the text</p>
, и это все, что вас, вероятно, заинтересует.
РЕДАКТИРОВАТЬ: Ой ... ну, вы можете попробовать это:
<xsl:template match="processing-instruction('xm-mark')">
<xsl:element name="mymark">
<xsl:call-template name="unescape">
<xsl:with-param name="input" select="substring-before(substring-after(., 'data="'), '"')" />
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template name="unescape">
<xsl:param name="input" />
<xsl:choose>
<xsl:when test="contains($input, '&lt;')">
<xsl:call-template name="unescape">
<xsl:with-param name="input" select="substring-before($input, '&lt;')" />
</xsl:call-template>
<xsl:text><</xsl:text>
<xsl:call-template name="unescape">
<xsl:with-param name="input" select="substring-after($input, '&lt;')" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$input" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Примечание: поскольку &
воспринимается как текст, а не как разметка, при обработке с помощью xslt вам необходимо использовать &
для ссылки на него. Следовательно, значение вашей инструкции обработки фактически представляется как &lt;p>etc..
, если оно было выведено «как есть» в XML-документе. Приведенный выше xsl по крайней мере преобразует это в <p>etc..
, но если вы хотите фактические теги p
, используйте метод расширения.