XSLT заменить строку на массив текста и узлов - PullRequest
0 голосов
/ 04 июля 2018

Допустим, у меня есть следующий XML-ввод:

<?xml version="1.0"?>
<root>
  <urls>
    <url>http://foo</url>
    <url>http://bar</url>
  </urls>
  <resources lang="en-US">
    <resourceString id='url-fmt'>See URL: {0}</resourceString>
  </resources>
</root>

Я хотел бы произвести следующий вывод с XSL (можно использовать 1.0, 2.0 или даже 3.0):

<?xml version="1.0"?>
<body>
  <p>See URL: <a href="http://foo">http://foo</a></p>
  <p>See URL: <a href="http://bar">http://bar</a></p>
</body>

У меня есть следующая заглушка таблицы стилей XSL, но я изо всех сил пытаюсь найти подходящую функцию, которая будет токенизировать строку ресурса, извлечь {0} и заменить ее на узел. replace(), похоже, не поможет, так как работает только со строками:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
  <xsl:variable name="urlResString"
                select="/root/resources/resourceString[@id='url-fmt']" />
  <xsl:template match="/">
    <body>
      <xsl:apply-templates select="/root/urls/url" />
    </body>
  </xsl:template>
  <xsl:template match="url">
    <p>
      <xsl:variable name='linkToInsert'>
        <a href='{.}'><xsl:value-of select='.'/></a>
      </xsl:variable>
      <xsl:value-of
           select="replace($urlResString, '\{0}', $linkToInsert)" />
    </p>
  </xsl:template>
</xsl:stylesheet>

Что генерируется здесь:

<?xml version="1.0"?>
<body>
  <p>See URL: http://foo</p>
  <p>See URL: http://bar</p>
</body>

Если бы вы могли указать мне правильные функции, это было бы здорово.

Примечание: возможно, мне придется сделать это для строк с {0}, {1} и т. Д., Как функции форматирования строк в .NET.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июля 2018
 <xsl:template match="root/urls">
        <body>
        <xsl:for-each select="url">
            <p>
                <xsl:value-of select=" substring-before(parent::urls/following-sibling::resources/resourceString,' {')"/><xsl:text> </xsl:text>
                <a href="{.}"><xsl:value-of select="."/></a>
            </p>
        </xsl:for-each>
        </body>
    </xsl:template>
    <xsl:template match="resources"/>
Try it
0 голосов
/ 04 июля 2018

вы можете использовать xsl:analyze-string следующим образом:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:variable name="urlResString"
        select="/root/resources/resourceString[@id='url-fmt']" />
    <xsl:template match="/">
        <body>
            <xsl:apply-templates select="/root/urls/url" />
        </body>
    </xsl:template>
    <xsl:template match="url">
        <p>
            <xsl:variable name='linkToInsert'>
                <a href='{.}'><xsl:value-of select='.'/></a>
            </xsl:variable>
            <xsl:analyze-string select="$urlResString" regex="\{{\d\}}">
                <xsl:matching-substring>
                    <xsl:copy-of select="$linkToInsert"/>
                </xsl:matching-substring>
                <xsl:non-matching-substring>
                    <xsl:copy/>
                </xsl:non-matching-substring>
            </xsl:analyze-string>
        </p>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...